tornado.wsgi — 他のPythonフレームワークおよびサーバーとの相互運用性

Tornado WebフレームワークのWSGIサポート。

WSGIはWebサーバーのPython標準であり、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)[ソース]

WSGI互換アプリケーションをTornadoのHTTPサーバーで実行できるようにします。

警告

WSGIは*同期*インターフェースですが、Tornadoの並行性モデルはシングルスレッドの*非同期*実行に基づいています。効率的なロングポーリングやWebsocketなど、Tornadoの多くの際立った機能はWSGIモードでは使用できません。WSGIContainer の主な目的は、単一のプロセスでWSGIアプリケーションとネイティブTornado RequestHandlers の両方をサポートすることです。WSGIのみのアプリケーションは、gunicornuwsgi などの専用WSGIサーバーを使用する方が良いでしょう。

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 をトップレベルのルーターとして使用し、tornado.web.FallbackHandler 内にWSGIContainer を埋め込むことができます。

executor 引数が指定されている場合、WSGIアプリケーションはそのexecutor上で実行されます。これはconcurrent.futures.Executor のインスタンスである必要があり、通常はThreadPoolExecutor です(ProcessPoolExecutor はサポートされていません)。executor が指定されていない場合、アプリケーションはTornado 6.3のイベントループスレッド上で実行されます。これはTornado 7.0ではデフォルトで内部スレッドプールを使用するように変更されます。

警告

デフォルトでは、WSGIアプリケーションはイベントループのスレッド上で実行されます。これにより、サーバーは一度に1つのリクエスト(プロセスごと)に制限され、他のほとんどのWSGIサーバーよりもスケーラビリティが低下します。そのため、アプリケーションがスレッドセーフであることを確認した後、WSGIContainer を構築するときにThreadPoolExecutor を渡すことを強くお勧めします。デフォルトはTornado 7.0でThreadPoolExecutor を使用するように変更されます。

バージョン 6.3 で追加: executor パラメータ。

バージョン 6.3 で非推奨: イベントループスレッドでWSGIアプリケーションを実行するデフォルトの動作は非推奨となり、Tornado 7.0ではデフォルトでスレッドプールを使用するように変更されます。

environ(request: HTTPServerRequest) Dict[str, Any][ソース]

tornado.httputil.HTTPServerRequest をWSGI環境に変換します。

バージョン 6.3 で変更: 静的メソッドではなくなりました。