twisted bekommen Körper der POST Anfrage
Ok,
Diese sollte einfach sein, da die Menschen tun es die ganze Zeit. Ich möchte den Hauptteil einer POST-Anfrage an ein twisted -Agent
. Dies ist mit einem twisted FileBodyProducer
. Auf der server-Seite, bekomme ich eine request
Objekt für meine render_POST
Methode.
Wie Kriege ich den Körper?
server:
from twisted.web import server, resource
from twisted.internet import reactor
class Simple(resource.Resource):
isLeaf = True
def render_GET(self, request):
return "{0}".format(request.args.keys())
def render_POST(self, request):
return "{0}".format(request.data)
with open(request.args['filename'][0], 'rb') as fd:
fd.write(request.write())
site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()
client:
from StringIO import StringIO
from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers
from twisted.web.client import FileBodyProducer
from twisted.internet.defer import Deferred
from twisted.internet.protocol import Protocol
from pprint import pformat
class BeginningPrinter(Protocol):
def __init__(self, finished):
self.finished = finished
self.remaining = 1024 * 10
def dataReceived(self, bytes):
if self.remaining:
display = bytes[:self.remaining]
print 'Some data received:'
print display
self.remaining -= len(display)
def connectionLost(self, reason):
print 'Finished receiving body:', reason.getErrorMessage()
self.finished.callback(None)
agent = Agent(reactor)
body = FileBodyProducer(StringIO("hello, world"))
d = agent.request(
'POST',
'http://127.0.0.1:8080/',
Headers({'User-Agent': ['Twisted Web Client Example'],
'Content-Type': ['text/x-greeting']}),
body)
def cbRequest(response):
print 'Response version:', response.version
print 'Response code:', response.code
print 'Response phrase:', response.phrase
print 'Response headers:'
print pformat(list(response.headers.getAllRawHeaders()))
finished = Deferred()
response.deliverBody(BeginningPrinter(finished))
return finished
d.addCallback(cbRequest)
def cbShutdown(ignored):
reactor.stop()
d.addBoth(cbShutdown)
reactor.run()
Nur docs, die ich finden kann für den Aufbau der consumer-Seite lassen Sie etwas zu wünschen übrig. Vor allem, wie kann ein Verbraucher der write(data)
Methode erhalten Ergebnisse?
Dem bisschen bin ich das fehlende plug diese beiden Komponenten zusammen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Recht, so ist es ebenso einfach wie das aufrufen
request.content.read()
. Diese, so weit wie ich sagen kann, ist nicht dokumentiert, in der API.Hier ist der aktualisierte code für den client:
Und hier ist der server:
Kann ich jetzt schreiben den Inhalt der Datei habe ich erhalten, und Lesen Sie die Ergebnisse zurück.
Wenn der content-type ist application/x-www-form-urlencoded oder multipart/form-data
der Körper wird analysiert und in die Anfrage.args dict.
Wenn der Körper ist zu groß, es steht in temp-Datei, ansonsten in StringIO.
Nachdem der Körper ist zu Lesen, die Methode finish() aufgerufen wird. Sie können eine Unterklasse Anfrage und
pares der Körper in dieser Methode oder do sth anderes.
wenn Sie wollen eine einfache POST mit dem Körper (nicht eine Datei) können Sie wie folgt tun
Jetzt oben im echten code kann man also
Beispiel-Header Aussehen sollte
Ich hoffe, das hilft