(機械翻訳) 要求オブジェクトと応答オブジェクト¶
注釈
この章は、Ian Bickingが最初に書いた:term: `WebOb`文書の一部から変更されています。
:app: Pyramid`は:term: Web`パッケージを:term: request`と:term: response`オブジェクト実装の基礎として使います。 :app: Pyramid:term:` view`に渡される:term: request`オブジェクトは:class: pyramid.request.Request`クラスのインスタンスです:class: webob.Request。 term: render:term:` renderer`は:mod: `pyramid.response.Response`クラスのインスタンスです。これはクラスのサブクラスです。 :class: `webob.Response`クラスです。また、必要に応じてview:class: `pyramid.response.Response`のインスタンスをビューから直接返すこともできます。
WebObは、app: Pyramid`とは別のプロジェクトで、別々の作者と完全に別々のドキュメントセット<http://docs.webob.org/en/latest/index.html> `_。 :app: `Pyramid`は標準のWebObリクエストにいくつかの機能を追加します。これは:ref: request_module` APIドキュメントに書かれています。
WebObは、HTTP要求と応答のオブジェクトを提供します。具体的には、 `WSGI <https://wsgi.readthedocs.io/en/latest/> `_環境と応答のステータス、ヘッダリスト、およびapp_iter(body)値を要求します。
WebOb要求オブジェクトと応答オブジェクトは、WSGI要求を解析してWSGI応答を生成する多くの便利さを提供します。 WebObは"生の" WSGI要求と応答を表現する良い方法です。しかし、app: `Pyramid`のユーザーは通常、WebObのWSGI関連の機能を直接使用する必要はありませんので、この文書のこのユースケースはカバーしません。 `リファレンスドキュメント<http://docs.webob.org/en/latest/reference.html> `_では、このようにリクエストを作成し、レスポンスオブジェクトを使用する多くの例が示されています。
要求¶
リクエストオブジェクトは WSGI environ辞書の周りのラッパーです<https://www.python.org/dev/peps/pep-0333/#environ-variables> `_。この辞書には、各ヘッダーのキー、要求を記述するキー(パスとクエリー文字列を含む)、要求本体のファイルのようなオブジェクト、およびさまざまなカスタムキーが含まれています。あなたはいつでも ` req.environ``でenvironにアクセスできます。
要求オブジェクトの最も重要で興味深い属性のいくつかを以下に示します。
- `` req.method``
- リクエストメソッド、例えば `` GET``、 `` POST``
- `` req.GET``
- A:term: `multidict`とクエリ文字列のすべての変数。
- `` req.POST``
- A:term: multidict`で、すべての変数がリクエストボディにあります。これは、リクエストが ` POST``でフォーム提出の場合にのみ変数を持ちます。
- `` req.params``
- A:term: multidict`で req.GET``と `req.POST``の全てを組み合わせています。
- `` req.body``
- 要求の本文の内容。これは要求本体全体を文字列として含みます。これは、要求がフォーム提出でない `` POST``や `` PUT``のような要求である場合に便利です。ファイルのようなオブジェクトに対して `` req.body_file``を得ることもできます。
- `` req.json_body``
- 要求の本文のJSONでデコードされた内容。参照:ref: `request_json_body`を参照してください。
- `` req.cookies``
- すべてのクッキーの簡単な辞書。
- `` req.headers``
- すべてのヘッダーの辞書。この辞書は大文字と小文字を区別しません。
- `` req.urlvars``と `` req.urlargs``
- `` req.urlvars``はリクエストURLに関連するキーワードパラメータです。 `` req.urlargs``は位置パラメータです。これらは `Routes <https://routes.readthedocs.io/en/latest/> `_と`セレクタ<https://github.com/lukearno/selector> `_。
また、標準のHTTPリクエストヘッダの場合、通常は「req.accept_language」、「req.content_length」、「req.user_agent」などの属性があります。これらのプロパティは、解析が意味を成すものであれば、各ヘッダの*解析された*形式を公開します。例えば、 `` req.if_modified_since``はa:mod: `datetime`オブジェクトを返します(ヘッダが与えられていなければNoneを返します)。
注釈
:app: Pyramid`リクエストオブジェクトの完全なAPIドキュメントは:ref: request_module`で利用できます。
リクエストに追加された特別な属性:app: Pyramid¶
:app: Pyramid`は、標準:term: WebOb`属性に加えて、 `` context``、 `` registry``、 `` root``、 `` subpath``、 virtual_root_path``、 `` session``、 `` matchdict``、 `` matched_route``の3つのオプションがあります。これらの属性は、class: pyramid.request.Request APIのドキュメントで詳しく説明されています。
URL¶
これらの属性に加えて、要求のURLとその部分を取得するいくつかの方法があります。アプリケーションが `` http:// localhost / app``にマウントされているURLの例 `` http:// localhost / app / blog?id = 10``のさまざまな値を示します。
- `` req.url``
- クエリ文字列を含む完全なリクエストURL(例: `` http:// localhost / app / blog?id = 10``)
- `` req.host``
- URLのホスト情報(例: `` localhost``)
- `` req.host_url``
- ホストとのURL(例: `` http:// localhost``)
- `` req.application_url``
- アプリケーションのURL(パスの `` SCRIPT_NAME``部分だけで、 `` PATH_INFO``ではなく)です(例えば `` http:// localhost / app``)。
- `` req.path_url``
- `` http:// localhost / app / blog`のような `` PATH_INFO``を含むアプリケーションのURL
- `` req.path``
- `` / app / blog`のように、ホストやスキームのない `` PATH_INFO``を含むURL
- `` req.path_qs``
- `` PATH_INFO``とクエリ文字列を含むURL、 `` / app / blog?id = 10``
- `` req.query_string``
- URL内のクエリ文字列、たとえば `` id = 10``
- `` req.relative_url(url、to_application = False) ``
- 現在のURLに関連するURLを指定します。 `` to_application``がTrueの場合、それは `` req.application_url``を基準にして解決されます。
メソッド¶
requestオブジェクトのメソッドはclass: `pyramid.request.Request`に記述されていますが、あまり多くは使用しないことがわかります。役に立つかもしれないカップルがあります:
- `` Request.blank(base_url) ``
- 指定されたURLに基づいて空の情報で新しいリクエストを作成します。これは、副依頼と人為的な要求に役立ちます。また、 `` req.copy() ``を使って既存のリクエストをコピーすることも、 `` req.copy_get() ``のサブリクエストにコピーすることもできますが、常にそれをGETに変えます(サブリクエスト)。
- `` req.get_response(wsgi_application) ``
- このメソッドは、この要求で指定されたWSGIアプリケーションを呼び出し、class: `pyramid.response.Response`オブジェクトを返します。サブリクエストやテストにも使用できます。
テキスト(Unicode)¶
リクエストエンコーディング/キャラクタセットが提供されている場合、リクエストオブジェクトのプロパティの多くはテキスト値(Python 2では `` unicode`、Python 3では `` str``)になります。提供されている場合、 `` req.POST``、 `` req.GET``、 `` req.params``、および `` req.cookies``の値にはテキストが含まれます。クライアントは `` Content-Type:application / x-www-form-urlencodedのようなもので文字セットを示すことができます。 charset = utf8``ですが、ブラウザで設定することはめったにありません。 `` newreq = req.decode( 'utf-8') ``で、または `` Request(environ、charset = 'utf8') ``でインスタンス化中に、既存のリクエストの文字セットをリセットできます。
マルチディック¶
WebOb要求のいくつかの属性は、( `` request.GET``、 `` request.POST``、 `` request.params``などの)マルチダイレクト構造です。 multidictは、キーが複数の値を持つことができる辞書です。典型的な例は、 ``?pref = red&pref = blue``のようなクエリ文字列です。 `` pref``変数には `` red``と `` blue``という2つの値があります。
マルチダイクでは、 `` request.GET ['pref'] ``を実行すると `` "blue" "(` pref``の最後の値)だけが返されます。この返された結果は期待通りではないかもしれません。文字列を返したり、時にはリストを返すことがあり、頻繁に例外が発生する可能性があります。 *すべての*値を元に戻すには、 ` request.GET.getall( 'pref') ``を使用します。 * 1つだけの*値があることを確かめたい場合は、 `` request.GET.getone( 'pref') ``を使います。これは、 `` pref ``。
`` request.GET.items() ``のような操作を使うと、 `` [( 'pref'、 'red')、( 'pref'、 'blue')] のようなものが返されます。すべてのキーと値のペアが表示されます。同様に ` request.GET.keys() ``は `` ['pref'、 'pref'] ``を返します。 Multidictはタプルのリストのビューです。すべてのキーが順序付けされ、すべての値が順序付けられます。
マルチダイクに関するAPIドキュメントは、class: `pyramid.interfaces.IMultiDict`として存在します。
JSONエンコーディングされたリクエストボディを扱う¶
バージョン 1.1 で追加.
:attr: pyramid.request.Request.json_body`はリクエストボディの:term: JSON`デコードされた表現を返すプロパティです。要求に本文がない場合、または本文が適切にJSONエンコードされた値でない場合、この属性にアクセスすると例外が発生します。
この属性は、例えば:jQueryの `` $ .ajax``関数を介して呼び出し可能な:app: `Pyramid`ビューを呼び出すときに便利です。この関数は、JSONでエンコードされたボディでリクエストを送信する可能性があります。
`` request.json_body``を使うことは次のようになります:
from json import loads
loads(request.body, encoding=request.charset)
以下は:term: jQuery`を使ってJavaScriptでAJAXリクエストを構築する方法です:リクエストが:app: Pyramid`アプリケーションに送られたときに `` request.json_body``属性を使うことができます:
jQuery.ajax({type:'POST',
url: 'http://localhost:6543/', // the pyramid server
data: JSON.stringify({'a':1}),
contentType: 'application/json; charset=utf-8'});
このような要求がアプリケーションのビューに到達すると、ビューの呼び出し可能な本体で `` request.json_body``属性が利用可能になります。
@view_config(renderer='string')
def aview(request):
print(request.json_body)
return 'OK'
上記のビューの場合、コンソールに表示されるのは次のようになります。
{u'a': 1}
ボーナスポイントについては、JavaScript AJAXリクエストの代わりにPythonの `` urllib2``を使って `` request.json_body``を介して読み込むのに適したボディを持つリクエストを生成するクライアント側コードのビットを次に示します:
import urllib2
import json
json_payload = json.dumps({'a':1})
headers = {'Content-Type':'application/json; charset=utf-8'}
req = urllib2.Request('http://localhost:6543/', json_payload, headers)
resp = urllib2.urlopen(req)
クロスオリジンリソース共有(CORS)を実行している場合、標準ではブラウザにプリフライトのHTTP OPTIONSリクエストを実行する必要があります。これを処理する最も簡単な方法は、 `` request_method``を `` OPTIONS``に設定して、同じルートに対して特別な `` view_config``を追加し、返す前に目的のレスポンスヘッダを設定することです。応答ヘッダーの例を見ることができます `アクセス制御CORS、プリフライトされたリクエスト<https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests> `_。
リクエスト後のクリーンアップ¶
場合によっては、データベース接続が関係しているときに、要求の最後にクリーンアップを実行する必要があります。
たとえば、SQLAlchemyを使用するapp: Pyramid`アプリケーションパッケージで、各リクエストの後に現在のSQLAlchemyデータベースセッションを削除したい場合、 mypackage``があるとします。 ` mypackage .__ init__``モジュールに以下を挿入してください:
1 2 3 4 5 6 7 8 9 10 11 | from mypackage.models import DBSession
from pyramid.events import subscriber
from pyramid.events import NewRequest
def cleanup_callback(request):
DBSession.remove()
@subscriber(NewRequest)
def add_cleanup_callback(event):
event.request.add_finished_callback(cleanup_callback)
|
要求の開始時に `` cleanup_callback``終了コールバックを登録すると( `` add_cleanup_callback``が各要求の開始時にclass: pyramid.events.NewRequest`イベントを受け取るようになります)、DBSessionは要求処理が終了するたびに削除されます。上記の例では、:class: `pyramid.events.subscriber`デコレータが動作するためには、アプリケーション中に mypackage``パッケージに対して:meth: pyramid.config.Configurator.scan`メソッドを呼び出さなければなりません初期化。
注釈
これはほんの一例です。特に、:app: Pyramid cookiecutterから生成されたアプリケーションで` DBSession.remove``を呼び出す必要はありません。これらはすべて pyramid_tm``パッケージを使用するためです。 ` pyramid_tm``:term: middleware`がアプリケーションに設定されている場合、 `DBSession.remove``で行われるクリーンアップは不要です。
応答¶
:app: Pyramid`レスポンスオブジェクトは、class: pyramid.response.Response`としてインポートできます。このクラスは `` webob.Response``クラスのサブクラスです。サブクラスは機能を追加または変更しないため、WebOb Responseのドキュメントはこのクラスにも完全に関連します。
応答オブジェクトには3つの基本的な部分があります。
- `` response.status``
- `` 200 OK``のような応答コードプラス理由メッセージ。メッセージなしでコードを設定するには、 `` status_int``、つまり `` response.status_int = 200``を使用します。
- `` response.headerlist``
- `` [( 'Content-Type'、 'text / html') ``のようなすべてのヘッダーのリスト。 `` response.headers``には大文字小文字を区別しないterm: `multidict`があり、これも同じヘッダにアクセスできます。
- `` Response.app_iter``
- 応答の内容を生成する反復可能なもの(リストやジェネレータなど)。これは、 `` response.body``(文字列)、 `` response.text``(unicodeオブジェクト、 `` response.charset``で通知)、 `` response.body_file``(aファイルに似たオブジェクトで、 `` app_iter``に追加します)。
オブジェクト内の他のすべては、通常、この基底状態から派生します。ここにいくつかのハイライトがあります:
- `` response.content_type``
`` charset``パラメータを含むコンテンツタイプ*ではありません。
典型的な使用法: `` response.content_type = 'text / html'``です。
デフォルト値: `` response.content_type = 'text / html'``。
- `` response.charset``
- content-typeの `` charset``パラメータは、 `` response.text``でエンコーディングも通知します。 `` response.content_type_params``はすべてのパラメータの辞書です。
- `` response.set_cookie(name、value、max_age = None、path = '/'、...) ``
- クッキーを設定します。キーワード引数は、さまざまなクッキーパラメータを制御します。 `` max_age``引数は、クッキーの長さを秒単位で表します(timedeltaオブジェクトも使用できます)。 `` Expires``キーも `` max_age``の値に基づいて設定されます。
- `` response.delete_cookie(name、path = '/'、domain = None) ``
- クライアントからクッキーを削除します。これは、 `` max_age``を0に設定し、クッキーの値を `` '' ``に設定します。
- `` response.cache_expires(秒= 0) ``
- これにより、応答が秒単位でキャッシュ可能になります。 `` seconds``が `` 0``の場合、レスポンスはキャッシュ不可能になります( `Expires`ヘッダも設定されます)。
- ``応答(environ、start_response) ``
- 応答オブジェクトはWSGIアプリケーションです。アプリケーションとしては、アプリケーションの作成方法に応じて動作します。インスタンス化するときに `` conditional_response = True``を渡すと条件付き応答を行うことができます(またはその属性を後で設定することもできます)。また、HEADおよびRange要求を行うこともできます。
ヘッダー¶
要求と同様に、ほとんどのHTTP応答ヘッダーはプロパティとして使用できます。これらは解析されるので、 `` response.last_modified = os.path.getmtime(filename) ``のようなことができます。
詳細は、:mod: webob.response APIドキュメントを参照してください。
レスポンスのインスタンス化¶
もちろん、ほとんどの場合、あなたはただ応答をしたいだけです。一般的に、レスポンスの属性はキーワードの引数としてクラスに渡すことができます。例:
1 2 | from pyramid.response import Response
response = Response(body='hello world!', content_type='text/plain')
|
ステータスは `` '200 OK``にデフォルト設定されています。
`` content_type``のデフォルト値は `` webob.response.Response.default_content_type``です。これは `` text / html``です。 :class: pyramid.response.Response`をサブクラス化し、 `default_content_type``を設定してこの振る舞いをオーバーライドすることができます。
例外レスポンス¶
`` 404 Not Found``のようなエラー応答を容易にするために、module:mod: pyramid.httpexceptions`はエラー応答の種類ごとにクラスを含みます。これらには、退屈だが適切なエラーボディが含まれる。このモジュールによって公開される例外は、:app: `Pyramid`の下で使用された場合、:mod: pyramid.httpexceptions`モジュールからインポートする必要があります。このインポート場所には、 `` webob.exc``モジュールでそれらを反映するサブクラスと置き換えが含まれています。
各クラスの名前は `` pyramid.httpexceptions.HTTP * ``です。ここで、 `` * ``はエラーの原因です。たとえば、:class: pyramid.httpexceptions.HTTPNotFound`というサブクラス:class: pyramid.response.Response`を使用すると、同じ方法でインスタンスを操作できます。典型的な例は次のとおりです。
1 2 3 4 5 6 | from pyramid.httpexceptions import HTTPNotFound
from pyramid.httpexceptions import HTTPMovedPermanently
response = HTTPNotFound('There is no such resource')
# or:
response = HTTPMovedPermanently(location=new_url)
|
詳細¶
レスポンスオブジェクトAPIの詳細については、:mod: pyramid.response`のドキュメントを参照してください。例外応答の詳細については、:mod: `pyramid.httpexceptions APIドキュメントを参照してください。 `WebOb documentation <http://docs.webob.org/en/latest/index.html> `_も便利です。