tordu corps de la requête POST
Ok,
Cela devrait être simple, depuis que les gens le font tout le temps. Je veux obtenir le corps d'une requête POST envoyé un tordu Agent
. Il est créé avec un tordu FileBodyProducer
. Sur le côté serveur, j'obtiens un request
objet de mon render_POST
méthode.
Comment puis-je récupérer le corps?
serveur:
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()
La seule docs que je peux trouver pour le réglage du consommateur laisser quelque chose à désirer. Surtout, comment un consommateur peut-il utiliser le write(data)
méthode pour recevoir résultats?
Qui peu me manque pour brancher ces deux composantes?
OriginalL'auteur Spencer Rathbun | 2012-07-18
Vous devez vous connecter pour publier un commentaire.
Tout droit, c'est aussi simple que d'appeler
request.content.read()
. Ce, pour autant que je peux dire, est sans papiers dans l' API.Voici le code mis à jour pour le client:
Et voici le serveur:
Je peux maintenant écrire le contenu du fichier je de recevoir et de lire les résultats.
OriginalL'auteur Spencer Rathbun
Si le type de contenu application/x-www-form-urlencoded ou multipart/form-data,
le corps va être analysé et mis dans la demande.args dict.
Si le corps est trop gros, c'est écrit dans le fichier temp, sinon dans StringIO.
Après que le corps est en lecture, la méthode finish() est appelée. Vous pouvez sous-classe de Demande et
pares le corps de cette méthode ou de faire qqch d'autre.
OriginalL'auteur Yavor Atov
si vous souhaitez faire un simple POST avec le corps (pas un fichier), vous pouvez faire comme suit
Maintenant pour une utilisation au-dessus dans le code réel, vous pouvez dire
Exemple les en-têtes doivent ressembler à
J'espère que ça aide
OriginalL'auteur darkman66