tornado.wsgi
— 与其他 Python 框架和服务器互操作¶
Tornado Web 框架的 WSGI 支持。
WSGI 是 Python 的 Web 服务器标准,允许 Tornado 与其他 Python Web 框架和服务器互操作。
此模块通过 WSGIContainer
类提供 WSGI 支持,它可以使在 Tornado HTTP 服务器上运行使用其他 WSGI 框架的应用程序成为可能。反之则不受支持;Tornado 的 Application
和 RequestHandler
类是为 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 应用程序和原生 TornadoRequestHandlers
。仅限 WSGI 的应用程序可能更适合使用专门的 WSGI 服务器,如gunicorn
或uwsgi
。将 WSGI 应用程序封装在
WSGIContainer
中,使其实现 TornadoHTTPServer
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 中的变更: 不再是静态方法。