7

我正在寻找一个支持分块编码回复的支持良好的多线程 Python HTTP 服务器。(即响应中的“传输编码:分块”)。为此目的,最好的 HTTP 服务器基础是什么?

4

5 回答 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 回答