リクエスト/レスポンスオブジェクト—Werkzeugドキュメント
リクエスト/レスポンスオブジェクト
要求オブジェクトと応答オブジェクトは、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("Hello %s!" % request.args.get('name', 'World!'))
return response(environ, start_response)
これは非常に一般的なタスクであるため、Request
オブジェクトはそのためのヘルパーを提供します。 上記のコードは次のように書き直すことができます。
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response("Hello %s!" % request.args.get('name', 'World!'))
アプリケーションは、環境を受け入れ、 start_response を呼び出すことができる有効なWSGIアプリケーションです。
ラッパーの可変性と再利用性
Werkzeugリクエストおよびレスポンスオブジェクトの実装は、特定のことを可能な限り禁止することにより、一般的な落とし穴からユーザーを保護しようとしています。 これには、高性能と落とし穴の回避という2つの目的があります。
リクエストオブジェクトには、次のルールが適用されます。
- リクエストオブジェクトは不変です。 変更はデフォルトではサポートされていませんが、変更する必要がある場合は、不変の属性を変更可能な属性に置き換えることができます。
- リクエストオブジェクトは同じスレッドで共有できますが、それ自体はスレッドセーフではありません。 複数のスレッドからアクセスする必要がある場合は、呼び出しの前後にロックを使用してください。
- リクエストオブジェクトをピクルスにすることはできません。
応答オブジェクトには、次のルールが適用されます。
- 応答オブジェクトは変更可能です
- freeze()が呼び出された後、応答オブジェクトをピクル化またはコピーできます。
- Werkzeug 0.6以降、複数のWSGI応答に同じ応答オブジェクトを使用しても安全です。
- copy.deepcopy を使用してコピーを作成することができます。
ベースラッパー
これらのオブジェクトは、共通の操作セットを実装します。 それらには、ユーザーエージェントの解析やetag処理などの凝ったアドオン機能がありません。 これらの機能は、さまざまなミックスインクラスでミキシングするか、Request
およびResponse
を使用して利用できます。
Mixinクラス
Werkzeugは、etag、キャッシュコントロール、ユーザーエージェントなどのさまざまなHTTP関連機能のヘルパーミックスインも提供します。 サブクラス化する場合、これらのクラスを組み合わせて、BaseRequest
またはBaseResponse
オブジェクトの機能を拡張できます。 次に、acceptヘッダーを解析するリクエストオブジェクトの小さな例を示します。
from werkzeug.wrappers import AcceptMixin, BaseRequest
class Request(BaseRequest, AcceptMixin):
pass
Request
およびResponse
クラスは、BaseRequest
およびBaseResponse
クラスをサブクラス化し、Werkzeugが提供するすべてのミックスインを実装します。
一般的な記述子
レスポンスストリーム
承認
認証
CORS
ETag
ユーザーエージェント
追加のMixinクラス
これらのミックスインは、デフォルトのRequest
およびResponse
クラスには含まれていません。 これらは、独自のサブクラスを作成することによってオプトインする必要がある追加の動作を提供します。
class Response(JSONMixin, BaseResponse):
pass
JSON