リクエスト/レスポンスオブジェクト—Werkzeugドキュメント
提供:Dev Guides
Werkzeug/docs/2.0.x/wrappers
リクエスト/レスポンスオブジェクト
要求オブジェクトと応答オブジェクトは、WSGI環境またはWSGIアプリケーションからの戻り値をラップして、別のWSGIアプリケーション(アプリケーション全体をラップ)にします。
それらがどのように機能するか
WSGIアプリケーションには常に2つの引数が渡されます。 WSGIの「環境」と応答フェーズを開始するために使用されるWSGI start_response 関数。 Request
クラスは、環境をラップして、リクエスト変数(フォームデータ、リクエストヘッダーなど)に簡単にアクセスできるようにします。
一方、Response
は、作成できる標準のWSGIアプリケーションです。 Werkzeugの単純なHelloWorldは次のようになります。
from werkzeug.wrappers import Response
application = Response('Hello World!')
それをより便利にするために、それを関数に置き換えて、いくつかの処理を行うことができます:
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
response = Response(f"Hello {request.args.get('name', 'World!')}!")
return response(environ, start_response)
これは非常に一般的なタスクであるため、Request
オブジェクトはそのためのヘルパーを提供します。 上記のコードは次のように書き直すことができます。
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response(f"Hello {request.args.get('name', 'World!')}!")
アプリケーションは、環境を受け入れ、 start_response を呼び出すことができる有効なWSGIアプリケーションです。
ラッパーの可変性と再利用性
Werkzeugリクエストおよびレスポンスオブジェクトの実装は、特定のことを可能な限り禁止することにより、一般的な落とし穴からユーザーを保護しようとしています。 これには、高性能と落とし穴の回避という2つの目的があります。
リクエストオブジェクトには、次のルールが適用されます。
- リクエストオブジェクトは不変です。 変更はデフォルトではサポートされていませんが、変更する必要がある場合は、不変の属性を変更可能な属性に置き換えることができます。
- リクエストオブジェクトは同じスレッドで共有できますが、それ自体はスレッドセーフではありません。 複数のスレッドからアクセスする必要がある場合は、呼び出しの前後にロックを使用してください。
- リクエストオブジェクトをピクルスにすることはできません。
応答オブジェクトには、次のルールが適用されます。
- 応答オブジェクトは変更可能です
- freeze()が呼び出された後、応答オブジェクトをピクル化またはコピーできます。
- Werkzeug 0.6以降、複数のWSGI応答に同じ応答オブジェクトを使用しても安全です。
- copy.deepcopy を使用してコピーを作成することができます。
ラッパークラス