tornado.wsgi — 与其他 Python 框架和服务器互操作

Tornado Web 框架的 WSGI 支持。

WSGI 是 Python 的 Web 服务器标准,允许 Tornado 与其他 Python Web 框架和服务器互操作。

此模块通过 WSGIContainer 类提供 WSGI 支持,它可以使在 Tornado HTTP 服务器上运行使用其他 WSGI 框架的应用程序成为可能。反之则不受支持;Tornado 的 ApplicationRequestHandler 类是为 Tornado HTTPServer 而设计的,不能在通用的 WSGI 容器中使用。

class tornado.wsgi.WSGIContainer(wsgi_application: WSGIAppType, executor: Optional[Executor] = None)[source]

使 WSGI 兼容的应用程序能够在 Tornado 的 HTTP 服务器上运行。

警告

WSGI 是一个同步接口,而 Tornado 的并发模型基于单线程异步执行。Tornado 的许多独特功能在 WSGI 模式下不可用,包括高效的长轮询和 WebSockets。 WSGIContainer 的主要目的是在一个进程中同时支持 WSGI 应用程序和原生 Tornado RequestHandlers。仅限 WSGI 的应用程序可能更适合使用专门的 WSGI 服务器,如 gunicornuwsgi

将 WSGI 应用程序封装在 WSGIContainer 中,使其实现 Tornado HTTPServer request_callback 接口。然后,可以将 WSGIContainer 对象传递给来自 tornado.routing 模块的类, tornado.web.FallbackHandler,或者直接传递给 HTTPServer

此类旨在让其他框架(Django、Flask 等)在 Tornado HTTP 服务器和 I/O 循环上运行。

现实中的用法会更加复杂,但最简单的示例使用手写 WSGI 应用程序和 HTTPServer

def simple_app(environ, start_response):
    status = "200 OK"
    response_headers = [("Content-type", "text/plain")]
    start_response(status, response_headers)
    return [b"Hello world!\n"]

async def main():
    container = tornado.wsgi.WSGIContainer(simple_app)
    http_server = tornado.httpserver.HTTPServer(container)
    http_server.listen(8888)
    await asyncio.Event().wait()

asyncio.run(main())

推荐的模式是使用 tornado.routing 模块在 WSGI 应用程序和你通常使用的 tornado.web.Application 之间设置路由规则。或者,可以使用 tornado.web.Application 作为顶级路由器,并在其中嵌入 WSGIContainer

如果提供了 executor 参数,则 WSGI 应用程序将在该执行器上执行。它必须是 concurrent.futures.Executor 的实例,通常是 ThreadPoolExecutor(不支持 ProcessPoolExecutor)。如果没有给出 executor,则应用程序将在 Tornado 6.3 中的事件循环线程上运行;这将在 Tornado 7.0 中更改为默认使用内部线程池。

警告

默认情况下,WSGI 应用程序在事件循环的线程上执行。这将服务器限制为一次只处理一个请求(每个进程),使其比大多数其他 WSGI 服务器的可扩展性差。因此,强烈建议你在构造 WSGIContainer 时传递一个 ThreadPoolExecutor,但在验证应用程序是线程安全的之后再传递。默认行为将在 Tornado 7.0 中更改为使用 ThreadPoolExecutor

版本 6.3 中新增: executor 参数。

版本 6.3 中已弃用: 在事件循环线程上运行 WSGI 应用程序的默认行为已弃用,将在 Tornado 7.0 中更改为默认使用线程池。

environ(request: HTTPServerRequest) Dict[str, Any][source]

tornado.httputil.HTTPServerRequest 转换为 WSGI 环境。

版本 6.3 中的变更: 不再是静态方法。