これは、人がいつもやっているので簡単です。私は、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を設定するために見つけることができる唯一のドキュメント。主に消費者がwrite(data)
メソッドを使用してにどのようにしての結果を受け取ることができますか?
これらの2つのコンポーネントを一緒に接続するのに欠けている部分は何ですか?
今後の参考として、os.stat()。st_sizeで設定されたcontent-lengthでrequest.write(fd.read())を実行しないことをお勧めします。私はrequest.write(fd.read())でデバイス上にIOErrorが残っていないという問題がありました。 メモリがあれば、まずファイルをバッファに読み込み、次にlen(buf)に基づいてコンテンツ長を実行することをお勧めします。 request.write(buf)を実行します。 –