ठीक है,पोस्ट अनुरोध के शरीर को
यह आसान होना चाहिए, क्योंकि लोग इसे हर समय करते हैं। मैं एक POST अनुरोध के शरीर को एक मोड़ Agent
भेजना चाहता हूं। यह एक मोड़ FileBodyProducer
के साथ बनाया गया है। सर्वर की तरफ, मुझे render_POST
विधि के लिए request
ऑब्जेक्ट मिलता है।
मैं शरीर को कैसे पुनर्प्राप्त करूं?
सर्वर:
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()
ग्राहक:
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()
केवल डॉक्स मैं उपभोक्ता पक्ष leave something to be desired स्थापित करने के लिए मिल सकता है। मुख्य रूप से, उपभोक्ता विधि पर परिणाम प्राप्त करने का तरीका कैसे उपयोग कर सकता है?
मुझे इन दोनों घटकों को एकसाथ प्लग करने के लिए कौन सा गुम है?
भविष्य के संदर्भ के लिए, मैं os.stat() st_size द्वारा सामग्री-लंबाई सेट के साथ request.write (fd.read()) नहीं करने की अनुशंसा करता हूं। मुझे एक मुद्दा था जहां मुझे अनुरोध पर डिवाइस पर IOError कोई स्थान नहीं छोड़ा गया था। लिखना (fd.read())। यदि आपके पास स्मृति है, तो मैं फ़ाइल को पहले बफर में पढ़ने की सिफारिश करता हूं, और फिर लेन (buf) के आधार पर सामग्री-लंबाई कर रहा हूं। फिर request.write (buf)। –