我尝试使用 t.p.basic.LineReceiver 获取 HTTP POST 请求正文,但失败了。我的代码如下:
from twisted.internet import reactor, protocol
from twisted.protocols import basic
class PrintPostBody(basic.LineReceiver):
def __init__(self):
self.line_no = 0
def lineReceived(self, line):
print '{0}: {1}'.format(str(self.line_no).rjust(3), repr(line))
self.line_no += 1
def connectionLost(self, reason):
print "conn lost"
class PPBFactory(protocol.ServerFactory):
protocol = PrintPostBody
def main():
f = PPBFactory()
reactor.listenTCP(80, f)
reactor.run()
if __name__ == '__main__':
main()
但是当我在 80 端口向那台机器发出 HTTP POST 请求时,只有 HTTP 请求 header 被打印出来。 示例输出:
0: 'POST / HTTP/1.0'
1: 'Host: ###.##.##.##'
2: 'Referer: http://#.#####.###/?ssid=0&from=0&bd_page_type=1&uid=wiaui_1292470548_2644&pu=sz%40176_229,sz%40176_208'
3: 'Content-Length: 116'
4: 'Origin: http://#.#####.###'
5: 'Content-Type: application/x-www-form-urlencoded'
6: 'Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
7: 'User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.11 (KHTML, like Gecko) Chrome/9.0.565.0 Safari/534.11'
8: 'Accept-Encoding: gzip,deflate,sdch'
9: 'Accept-Language: en-US,en;q=0.8'
10: 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3'
11: 'Via: 1.1 #####.###.###.##:8080 (squid/2.6.STABLE21)'
12: 'X-Forwarded-For: ###.##.###.###'
13: 'Cache-Control: max-age=0'
14: 'Connection: keep-alive'
15: ''
所以这里没有关闭连接,但是也没有收到 POST 正文。
我已经通过运行 sudo nc -l 80
测试了网络状况,它确实打印出了 HTTP POST 请求正文。
那么,如何使用 Twisted 获取 HTTP POST 请求正文? 非常感谢。
最佳答案
我怀疑您没有看到打印出的请求正文,因为它不包含任何换行符或以换行符结尾。所以它进入了您的 PrintPostBody 实例的解析缓冲区并永远坐在那里,等待换行符指示已收到完整行。 LineReceiver 在收到整行之前不会调用 lineReceived 回调。
相反,你可以让 Twisted Web 为你做这个解析:
from twisted.web.server import Site # Site is a server factory for HTTP
from twisted.web.resource import Resource
from twisted.internet import reactor
class PrintPostBody(Resource): # Resources are what Site knows how to deal with
isLeaf = True # Disable child lookup
def render_POST(self, request): # Define a handler for POST requests
print request.content.read() # Get the request body from this file-like object
return "" # Define the response body as empty
reactor.listenTCP(80, Site(PrintPostBody()))
reactor.run()
关于python - 使用 Twisted 获取 HTTP POST 请求正文失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481644/