我正在寻找一个支持分块编码回复的支持良好的多线程 Python HTTP 服务器。(即响应中的“传输编码:分块”)。为此目的,最好的 HTTP 服务器基础是什么?
问问题
6005 次
5 回答
5
Twisted 支持分块传输编码(API 链接)(另请参阅HTTPChannel的 API 文档)。有许多使用 Twisted 的生产级项目(例如,Apple 将它用于 Mac OS X Server 中的 iCalendar 服务器),因此它得到了很好的支持并且非常健壮。
于 2009-04-08T23:22:39.710 回答
2
Twisted 支持分块传输,并且这样做是透明的。即,如果您的请求处理程序没有指定响应长度,twisted 将自动切换到分块传输,并且每次调用 Request.write 都会生成一个块。
于 2012-02-17T10:00:40.540 回答
0
我很确定符合 WSGI 的服务器应该支持这一点。本质上,WSGI 应用程序返回可迭代的块,网络服务器返回这些块。我没有这方面的第一手经验,但这里有一个兼容服务器列表。
我应该认为,如果 WSGI 服务器不满足您的要求,使用 Python 的内置CGIHTTPServer来滚动您自己的服务器会相当容易。它已经是多线程的,因此您可以将响应分块。
于 2009-04-08T23:18:10.143 回答
0
我设法使用Tornado做到了:
#!/usr/bin/env python
import logging
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8080, help="run on the given port", type=int)
@tornado.web.stream_request_body
class MainHandler(tornado.web.RequestHandler):
def post(self):
print()
def data_received(self, chunk):
self.write(chunk)
logging.info(chunk)
def main():
tornado.options.parse_command_line()
application = tornado.web.Application([
(r"/", MainHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
main()
于 2016-11-18T09:19:30.360 回答
0
您可以使用 Python 的 HTTPServer 实现一个简单的分块服务器,方法是将其添加到您的服务函数中:
def _serve(self, res):
response = next(res)
content_type = 'application/json'
self.send_response(200)
self.send_header('Content-Type', content_type)
self.send_header('Transfer-Encoding', 'chunked')
self.end_headers()
try:
while True:
r = response.encode('utf-8')
l = len(r)
self.wfile.write('{:X}\r\n{}\r\n'.format(l, r).encode('utf-8'))
response = next(it)
except StopIteration:
pass
self.wfile.write('0\r\n\r\n'.encode('utf-8'))
我不建议将其用于生产用途。
于 2021-09-17T07:59:01.243 回答