(機械翻訳) 設定を表示¶
:term: View lookup`は:app: Pyramid`サブシステムで、:term: view callable`を見つけて呼び出します。 :term: `View configuration`は、アプリケーションでどのようにterm: view lookup`が動作するかを制御します。任意の所与の要求の間、ビュー構成情報は、ビュールックアップサブシステムによって要求データと比較され、その要求に対してコール可能な「最良の」ビューを見つける。
これまでの章では、あまり説明のない簡単なビュー構成宣言に慣れてきました。この章では、主題について詳しく説明します。
リソースまたはURLパターンをビュー呼び出し可能にマッピングする¶
開発者は:term: view callable`を:term: view configuration`を介してa:app: `Pyramid`アプリケーション内で利用できるようにします。ビュー構成では、呼び出し可能なビューを呼び出すために真でなければならない状況のセットを決定する一連のステートメントと、呼び出し可能なビューを関連付けます。
ビュー設定ステートメントは、:term: context`リソース(または例外)と:term: request`に存在する情報について行われます。
ビュー構成は、次の2つの方法のいずれかで実行されます。
- Pythonオブジェクトに:ref: mapping_views_using_a_decorator_section`として添付された:class: pyramid.view.view_config`デコレータを持つアプリケーションソースコードに対して:term: `scan`を実行します。
- :meth: pyramid.config.Configurator.add_view`メソッドを:ref: mapping_views_using_imperative_config_section`として使用します。
設定パラメータの表示¶
すべての形式のビュー構成は、同じ一般的な型の引数を受け入れます。
ビュー設定中に提供される多くの引数は、term: `view述語`引数です。ビュー設定時に使用されるビュー述語引数は、term: `view lookup`が特定のビューを呼び出し可能にする状況のセットを絞り込むために使用されます。
:term: View predicate`属性は:term: view lookup`サブシステムが適切なビューを見つけて呼び出すことを可能にするビュー設定の重要な部分です。ビューの構成が保持する述部属性の数が多いほど、登録ビューの呼び出し可能性が呼び出される前に状況がより具体的になる必要があります。特定のビュー構成に供給される述部の数が少ないほど、関連するビュー呼び出し可能関数が呼び出される可能性が高くなります。 5つの述部を持つビューは、たとえば2つのビューの前に常に見つけられ、評価されます。
しかし、これは:app: `Pyramid`は、一致しない述語を持つビュー登録を見つけたときに"探していることを止める"という意味ではありません。 1組のビュー述語が一致しない場合は、ビューが見つかるまで、またはビューと一致するビューが見つからなくなるまで、述語には"次の最も特殊な"ビュー(存在する場合)が参照されます。要求環境にすべて一致する一連の述部を持つ最初のビューが呼び出されます。
要求と一致させることができる述語を持つビューが見つからない場合、:app: Pyramid`は、ユーザのブラウザに"見つからない"(404)ページを表すエラーを返します。デフォルト:term: `Not Found View`の変更については、ref: changing_the_notfound_view`を参照してください。
他のビュー設定引数は、述語でない引数です。これらは、呼び出し可能なビューの応答を変更するか、または呼び出しポリシーが許可ポリシーのために呼び出されないようにします。ビュー構成内に述語でない引数が存在しても、ビュー呼び出し可能関数が呼び出される状況は限定されません。
非述語引数¶
- ``許可 ``
:term: view callable`を呼び出すためにユーザが所有しなければならないa:term: permission`の名前。ビューのセキュリティと権限の詳細については、:ref: `view_security_section`を参照してください。
`` permission``が指定されていない場合、このビューにはアクセス権が登録されていません(呼び出し元からアクセス可能です)。
- `` attr``
ビュー機構は、デフォルトで:term: view callable`(ビュー呼び出し可能関数が関数の場合は関数自体)の __call__``メソッドを使用して応答を取得します。 ` attr``値は、レスポンスを取得するために使用されるメソッド属性を変更することを可能にします。たとえば、ビューがクラスで、クラスに `` index``という名前のメソッドがあり、クラスの `` __call__``メソッドの代わりにこのメソッドを使用してレスポンスを返す場合は、 ``ビューのビュー構成では、attr = "index " ``これは、ビュー定義がクラスである場合に最も便利です。
`` attr``が与えられていなければ `` None``が使われます(ビューが関数の場合は関数そのものを意味し、ビューがクラスの場合は `` __call__``の呼び出し可能な属性を意味します)。
- レンダラー
関連するビュー呼び出し可能戻り値から:term: response`を構築するために使用される:term: renderer`実装を示します。
参考
参照:ref: `renderers_chapter`を参照してください。
これは単一の文字列(例えば `` json``)かパスを意味する文字列、または:term: 資産指定`(例えば ` templates / views.pt``)a:term: renderer実装。 ` renderer``の値にドット( `` .``)が含まれていない場合、指定された文字列はレンダラー実装をルックアップするために使用され、レンダラー実装はビュー戻り値。 `` renderer``の値にドット( `` .``)が含まれている場合、指定された用語はパスとして扱われ、パスの最後の要素のファイル名拡張子はレンダラー実装をルックアップするために使われます。それは完全なパスを通過します。
レンダラーがパスである場合、パスは通常単純な相対パス名です(例えば `` templates / foo.pt``、"foo.pt "という名前のテンプレートは"templates "にあります)ディレクトリ:現在の:term: package`のディレクトリからの相対パス) - パスは絶対パスでもよく、UNIXの場合はスラッシュ、Windowsの場合はドライブ文字の接頭辞で始まります。代わりに、パスは ` some.dotted.package_name:relative / path``の形式で:term: `asset specification`とすることができ、別のパッケージにあるテンプレートアセットを扱うことができます。
`` renderer``属性はオプションです。定義されていない場合、レンダリングは行われません(レンダリングは行われず、値は変更されずにアップストリーム:app: Pyramid`機械に戻されます)。ビュー呼び出し側が:term: `response`(:ref: the_response`を参照)を返した場合、指定されたレンダラー実装は決して呼び出されません。
- `` http_cache``
ビュー設定に `` http_cache``値を指定すると、関連するview呼び出し可能で生成されたレスポンスの `` Expires``と `` Cache-Control``ヘッダーが変更されます。 `` http_cache``の値は次のいずれかです:
- 非ゼロの整数。ゼロ以外の整数の場合、秒数として扱われます。この秒数は、このビューを呼び出すリクエストに対するレスポンスの `` Expires``ヘッダと `` Cache-Control:max-age``パラメータを計算するために使用されます。たとえば、 `` http_cache = 3600``は、リクエストしているブラウザに「この応答を1時間キャッシュしてください」と指示します。
- `` datetime.timedelta``インスタンスです。 `` datetime.timedelta``インスタンスの場合、秒数に変換され、その秒数が `` Expires``ヘッダーと `` Cache-Control:max-age ''を計算するために使われますこのビューを呼び出す要求への応答のパラメータ。例: `` http_cache = datetime.timedelta(days = 1) ``は、リクエストしているブラウザに「この応答を1日キャッシュしてください」と指示します。
- 0( `` 0``)。値がゼロの場合、このビューからのすべての応答に存在する `` Cache-Control``と `` Expires``ヘッダーは、クライアントブラウザのキャッシュ(および任意の中間キャッシュ)にレスポンスをキャッシュしないように構成されます。
- 2タプル。 2タプル( `` http_cache =(1、{'public':True)) ``)の場合、タプルの最初の値は非ゼロの整数または `` datetime.timedelta``のインスタンスになります。いずれの場合も、この値はレスポンスをキャッシュする秒数として使用されます。タプルの2番目の値は辞書でなければなりません。辞書にある値は `` Cache-Control``レスポンスヘッダへの入力として使われます。例えば、 `` http_cache =(3600、{'public':True})は ``キャッシュを1時間意味し、 `` public``をレスポンスのCache-Controlヘッダに追加します。 `` webob.cachecontrol.CacheControl``インターフェースでサポートされているすべてのキーと値を辞書に追加することができます。 `` {'public':True} ``を提供することは、 `` response.cache_control.public = True``を呼び出すことと等価です。
`` http_cache``として非タプルの値を与えることは、あなたのビューのボディ内で `` response.cache_expires(value) ``を呼び出すことと同じです。
`` http_cache``として2タプルの値を与えることは、あなたのビューのボディ内で `` response.cache_expires(value [0]、** value [1]) ``を呼び出すのと同じです。
`` Expires`ヘッダに影響を与えず、 `` Cache-Control``ヘッダーにのみ影響を与えたい場合は、 `` None``の最初の要素、 `` http_cache``としてタプルを渡します。 、 ``(None、{'public':True}) ``となります。
`` require_csrf``
CSRFチェックは、RFC2616で"安全"と定義されていないリクエストメソッドに影響します。これは、GET、HEAD、OPTIONS、TRACEメソッドがそのまま渡され、他のすべてのメソッドがCSRFを必要とすることを意味します。このオプションは `` pyramid.require_default_csrf``設定と組み合わせて使用され、CSRFトークンをチェックする要求パラメータを制御します。
この機能には、設定済み:term: `セッションファクトリ`が必要です。
このオプションが `` True``に設定されている場合、CSRFチェックはこのビューに対するPOSTリクエストに対して有効になります。必要なトークンは `` pyramid.require_default_csrf``の設定で指定されたもので、 `` csrf_token``にフォールバックします。
このオプションが文字列に設定されている場合、CSRFチェックは有効になり、 `` pyramid.require_default_csrf``設定に関係なく、必要なトークンとして使用されます。
このオプションが `` False``に設定されている場合、 `` pyramid.require_default_csrf``設定に関係なく、CSRFチェックは無効になります。
さらに、このオプションが `` True``または文字列に設定されている場合、CSRF起点チェックが有効になります。
詳細は:ref: `auto_csrf_checking`を参照してください。
バージョン 1.7 で追加.
- ラッパー
このビューの応答本体をそれ自身の:request.wrapped_body`属性として受け取る:term: request`と: term: `response`は、このビューによって自身の要求の request.wrapped_response``属性として返されます。ラッパーを使用すると、ビューをまとめて"チェーン"して複合レスポンスを形成することができます。最も外側のラッパー・ビューの応答がユーザーに戻されます。ラッパービューは、任意のビューが見つかると見つかります。参照:ref: `view_lookup`を参照してください。 "ベスト"ラッパービューはルックアップの順序に基づいて検索されます。 "Under the Hood "このラッパービューは、 ` pyramid.view.render_view_to_response(context、request、 'wrapper_viewname') ``で検索されます。ラッパー・ビューのコンテキストおよび要求は、同じコンテキストおよび内部ビューの要求です。
`` wrapper``が与えられていなければ、ラッパービューは使用されません。
- ``デコレータ ``
A:term: dotted Python name`を、登録された:term: view callable`を装飾するために使用される関数(または関数自体)に追加します。デコレータ関数は、呼び出し可能なビューを単一の引数として呼び出されます。呼び出し可能なビューは ``(context、request) 'を受け入れます。デコレータは、 ``(context、request) `'を受け付ける代わりのview callableを返さなければなりません。 ` decorator``は、デコレータの繰り返し可能性があります。その場合、逆順でビューに順番に適用されます。例えば::
@view_config(..., decorator=(decorator2, decorator1)) def myview(request): ...
ビューを直接呼び出し可能にすることと似ています:
@view_config(...) @decorator2 @decorator1 def myview(request): ...
重要な違いは、各デコレータはビュー呼び出し可能から返された生の値の代わりに:class: `pyramid.interfaces.IResponse`を実装する応答オブジェクトを受け取ることです。チェーン内のすべてのデコレータは、レスポンスオブジェクトを返すか、例外を送出する必要があります。
def log_timer(wrapped): def wrapper(context, request): start = time.time() response = wrapped(context, request) duration = time.time() - start response.headers['X-View-Time'] = '%.3f' % (duration,) log.info('view took %.3f seconds', duration) return response return wrapper
- ``マッパ ``
- Pythonオブジェクトまたは:term: dotted Python name::term:` view mapper`または `` None``を参照してください。デフォルトでは `` None``です。これは、ビューがデフォルトビューマッパーを使用する必要があることを示します。このプラグインポイントはPyramid拡張開発者には便利ですが、株式ピラミッドアプリケーションを開発している"一般市民"にとってはあまり役に立ちません。カーテンの後ろの男には注意を払わないでください。
述語引数¶
これらの引数は、ビューの参照動作を変更します。一般に、より述語的な引数が提供されるほど、設定されたビューの使用がより具体的で狭くなります。
- 「名前」
このビューを呼び出し可能にするには、:term: view name`が必要です。 ` name``引数は通常、アプリケーションがterm: `traversal`を使用する場合にのみ使用されます。ビュー名の概念を理解するために:ref: `traversal_chapter`を読んでください。
`` name``が与えられていなければ、空の文字列が使われます(デフォルトのビューを意味します)。
- 「文脈」
:term: context`リソースは、:term: context`リソースがこのビューを見つけるために提供しなければならないインスタンス*または* the:term: interface`でなければならないPythonクラスを表すオブジェクトです。と呼ばれる。この述語は:term: `context`リソースが表現されたクラスのインスタンスである場合、または:term: context`リソースが表現されたインタフェースを提供する場合に真です。それ以外の場合はfalseです。
コンテキストが例外をサブクラス化する可能性がある場合、例外クラスをコンテキストとして渡すことは可能です。この場合、* 2つのビューが登録されます。 1つは通常の着信要求と一致し、もう1つは:term: `例外ビュー 'と一致します。これは、通常の要求処理パイプラインで例外が発生した場合にのみ発生します。
`` context``が与えられていない場合は、任意のリソースにマッチする `` None``という値が使われます。
`` exception_only``
この値が `` True``の場合、 `` context``引数は `` Exception``のサブクラスでなければなりません。このフラグは、:term: 例外ビュー 'のみを作成し、traversal:term: context`が `` context``引数と一致する場合、このビューは一致してはならないことを示します。 `` context``が `` Exception``のサブクラスで、この値が `` False``(デフォルト)の場合、トラバーサル:term: `context`にもマッチするビューが登録されます。
バージョン 1.8 で追加.
- `` route_name``
`` route_name``が指定された場合、呼び出されたビューは指定されたルートが一致したときにのみ呼び出されます。
この値は、このビューが呼び出される前に一致しなければならない:term: ルート設定`宣言(:ref: `urldispatch_chapter`参照)の name``と一致しなければなりません。 ` route_name``で参照される `` route``の設定は通常 `` traverse``トークンを `` pattern``の値に持つことに注意してください。これは、使用されるパスの一部を表します:term:ルートの結果に対する traversal:term:`ルートファクト `。
`` route_name``が与えられていなければ、呼び出し可能なビューは他のルートが一致していなければ起動されます。これは:term: `resource location`で見つかったリクエスト/コンテキストのペアが、設定されたルートと一致していることを示していないときです。
- `` request_type``
この値は、:term: request`がこのビューを見つけて呼び出すために提供しなければならない:term: interface`でなければなりません。
`` request_type``が指定されていない場合は、 `` None``という値が使われます。
- `` request_method``
この値は、文字列( `` "GET "
、 `` POST ""、 `` \ "PUT \" ``、 `` \ "DELETE \" ``、 `` \ "HEAD \" ``、 `` \ "OPTIONS \" ``)、またはこれらの文字列の1つ以上を含むタプルを返します。この引数を持つビュー宣言は、要求の `` method``属性(つまり、WSGI環境の `` REQUEST_METHOD
)が指定された値と一致した場合にのみビューが呼び出されることを保証します。バージョン 1.4 で変更: `` "GET " "の使用は、ビューが "" HEAD " `に応答することを意味します。
`` request_method``が与えられていなければ、:term: WSGI`環境の `REQUEST_METHOD``に関係なくビューが呼び出されます。
- `` request_param``
この値には、任意の文字列または一連の文字列を使用できます。この引数を指定したビュー宣言は、:term: request`が request.params``ディクショナリ(HTTPの GET``または `POST``変数)を指定します。
`` request_param = "foo = 123 "
のように `` = ``という記号が与えられた場合、キー( `` foo
)は要求に存在しなければなりません。 params``ディクショナリ、*、*の値は、現在のリクエストに一致するように、式の右側( `` 123
)に一致する必要があります。`` request_param``が与えられていない場合、ビューは `` request.params``ディクショナリのキーと値を考慮せずに呼び出されます。
- `` match_param``
このパラメータは、"key = value "という形式の単一文字列か、これらの文字列の1つ以上を含むタプルのいずれかです。
この引数は、:term: request`が:term: matchdict`の中に述語で与えられたものと等しいキーと値のペアを持つ場合にのみ、ビューが呼び出されることを保証します。例えば、 `` match_param = "action = edit "
は `:`の `` action``パラメータを必要とします:term: `matchdict`は式の右側(` `edit
)現在のリクエストに"一致する"を表示します。`` match_param``がタプルの場合、すべてのキーと値のペアは述語が渡すために一致しなければなりません。
`` match_param``が与えられていなければ、 `` request.matchdict``のキーと値を考慮せずにビューが呼び出されます。
バージョン 1.2 で追加.
- 「封じ込め」
この値は、コンテキストリソースの:term: lineage`内の親オブジェクトがこのビューを見つけて呼び出すために提供しなければならないPythonクラスまたは:term: interface`への参照でなければなりません。この機能を使用するには、リソースツリーのリソースが"location-aware "である必要があります。
`` containment``が指定されていない場合、ビューの呼び出し可能呼び出しを呼び出すかどうかを決定する際には、系統のインターフェースとクラスは考慮されません。
位置認識の詳細については:ref: `location_aware`を参照してください。
- `` xhr``
この値は `` True``または `` False``のいずれかでなければなりません。この値が指定されていて `` True``である場合、:term: WSGI`環境は XMLHttpRequest ''という値を持つ HTTP-X-REQUESTED_WITH``ヘッダー(つまり X-Requested-With`) ``が呼び出されて呼び出され、呼び出されるようにします。これは、jQuery、Prototype、およびその他のJavascriptライブラリから発行されたAJAXリクエストを検出するのに便利です。
`` xhr``が指定されていない場合、HTTPヘッダーは考慮されません。
- 「受け入れる」
この引数の値は、 `` Accept`` HTTPリクエストヘッダ内の1つまたは複数のMIMEタイプの一致クエリを表します。この値が指定されている場合は、次の形式のいずれかでなければなりません: `` text / plain` "の形式のmimetypeマッチトークン、` text / * の形式のワイルドカードmimetypeマッチトークン、 -allワイルドカードmimetypeは ` * / * ``の形式でトークンにマッチします。いずれかのフォームがリクエストの `` Accept``ヘッダと一致する場合、この述語は真となります。
`` accept``が指定されていない場合、HTTP_ACCEPT`` HTTPヘッダーは、関連するビューを呼び出し可能にするかどうかを決定する際には考慮されません。
- ``ヘッダー ``
この値は、HTTPヘッダー名またはヘッダー名/値のペアを表します。
`` header``が指定されている場合は、ヘッダ名または `` headername:headervalue``の組でなければなりません。
もし `` header``が値なしで指定されていれば(例えば、 `` If-Modified-Since``のような裸のヘッダ名のみ)、要求にHTTPヘッダーが存在すればビューが呼び出されます。
`` Header``が指定されていて、名前と値のペア( `` User-Agent:Mozilla /.*``など)を持っている場合、ビューはHTTPヘッダーが存在する場合にのみ呼び出されます*要求された値と一致します。 `` headervalue``に
: ``(コロン)が含まれていると、それは名前と値のペアとみなされます(例えば `` User-Agent:Mozilla /.* ``や `` Host:localhost
)。値の部分は正規表現でなければなりません。値がヘッダー名またはヘッダー名/値のペアを表すかどうかに関係なく、ヘッダー名の大文字小文字は重要ではありません。
`` header``が指定されていない場合、関連するビューを呼び出し可能にするかどうかを決定する際に、HTTPヘッダーの構成、存在または不在は考慮されません。
- `` path_info``
この値は、 `` PATH_INFO`` WSGI環境変数に対してテストされる正規表現パターンを表し、関連するビューを呼び出し可能にするかどうかを決定します。正規表現が一致する場合、この述語は `` True``になります。
`` path_info``が指定されていない場合、WSGIの `` PATH_INFO``は、関連するビューを呼び出すかどうかを決定する際に考慮されません。
- `` check_csrf``
指定する場合、この値は `` None``、 `` True``、 `` False``、または"check name "を表す文字列のいずれかでなければなりません。値が `` True``または文字列の場合、CSRFチェックが実行されます。値が `` False``または `` None``の場合、CSRFチェックは実行されません。
指定された値が文字列の場合、その文字列は"チェック名"として使用されます。指定された値が `` True``の場合、 `` csrf_token``がチェック名として使用されます。
CSRFチェックが実行されると、チェックされた値は `` request.POST [check_name] ``の値になります。この値は `` request.session.get_csrf_token() ``の値と比較され、これらの2つの値が同じ場合にチェックが合格します。チェックが合格すると、関連するビューの実行が許可されます。検査が失敗した場合、関連するビューは実行できません。
この機能を使用するには、:term: `session factory`が設定されている必要があります。
バージョン 1.4a2 で追加.
- `` physical_path``
指定された場合、この値は、この述語が真と一致するために、トラバーサルによって見つかったコンテキストの:term: 物理パス 'を表す文字列またはタプルでなければなりません。たとえば、 ` physical_path = '/' ``、 `` physical_path = '/ a / b / c```や `` physical_path =(' '、' a '、' b '、' c ') ` 。これは、パス接頭辞の一致または正規表現ではなく、全体パスの一致です。これは、あるオブジェクトがトラバースされているときに常にビューを表示したいときに便利ですが、どのようなオブジェクトであるかを確かめることができないので、 ` context``述語を使うことはできません。スラッシュ文字またはタプル要素の間の個々のパス要素は、リソース名のUnicode表現である必要があり、決してエンコードしないでください。
バージョン 1.4a3 で追加.
- `` effective_principals``
指定する場合、この値は:term: principal`識別子または一連のプリンシパル識別子でなければなりません。 :meth: `pyramid.request.Request.effective_principals`メソッドが、引数リストに指定されたすべてのプリンシパルが現在のリクエストに存在することを示す場合、この述語はTrueを返します。それ以外の場合はFalseを返します。たとえば、 ` effective_principals = pyramid.security.Authenticated``や `` effective_principals =( 'fred'、 'group:admins') ``などです。
バージョン 1.4a4 で追加.
- `` custom_predicates``
`` custom_predicates``が指定されていれば、それはカスタム述語呼び出し可能関数への参照のシーケンスでなければなりません。事前定義された述部のセットが必要な場合には、カスタム述部を使用します。カスタム述部は、必要に応じて事前定義された述部と組み合わせることができます。呼び出し可能な各カスタム述語は、 `` context``と `` request``という2つの引数を受け取り、コンテキストリソースや要求の任意の評価を行った後、 `` True``または `` False``を返すべきです。すべての呼び出し可能ファイルが `` True``を返す場合、呼び出し可能な関連ビューは与えられた要求に対して実行可能であると見なされます。
`` custom_predicates``が指定されていない場合、カスタム述部は使用されません。
- ``述語 ``
ここでキー/値のペアを渡すと:meth: `pyramid.config.Configurator.add_view_predicate`で登録されたサードパーティの述語を使用します。複数のキーと値のペアを同時に使用できます。第三者の述語の詳細については、ref: `view_and_route_predicates`を参照してください。
バージョン 1.4a1 で追加.
述語値の反転¶
任意の述語値の意味を、class: `pyramid.config.not_`への呼び出しでラップすることによって、その意味を逆転させることができます。
1 2 3 4 5 6 7 | from pyramid.config import not_
config.add_view(
'mypackage.views.my_view',
route_name='ok',
request_method=not_('POST')
)
|
上記の例では、少なくとも他のビューがより具体的でない場合、リクエストメソッドが* * `POST`でない場合にビューが呼び出されることを保証します。
述部の値を `` not_``にラップするこの手法は、述部の値が受け入れられればどこでも使用できます:
- :meth: pyramid.config.Configurator.add_view
- :meth: pyramid.view.view_config
バージョン 1.5 で追加.
`` @ view_config``デコレータを使ったビュー設定の追加¶
警告
この機能を使用すると、アプリケーションの起動時にビューの構成宣言をスキャンする作業が増えるため、アプリケーションの起動がわずかに遅くなりがちです。起動時のパフォーマンスを最大にするには、代わりに:ref: `mapping_views_using_imperative_config_section`で説明されているビュー設定方法を使用してください。
:class: 〜pyramid.view.view_config`デコレータは:term: view configuration`情報を、:app: `Pyramid`ビュー呼び出しとして動作する関数、メソッド、またはクラスに関連付けるのに使用できます。
次に、a:app: Pyramid`アプリケーションモジュール内にあるclass:〜pyramid.view.view_config`デコレータの例を示します。 `` views.py``:
1 2 3 4 5 6 7 | from resources import MyResource
from pyramid.view import view_config
from pyramid.response import Response
@view_config(route_name='ok', request_method='POST', permission='read')
def my_view(request):
return Response('OK')
|
上記のようにこのデコレータを使用すると、この必須構成スタンザを追加する必要性が置き換えられます。
1 2 | config.add_view('mypackage.views.my_view', route_name='ok',
request_method='POST', permission='read')
|
`` view_config``の引数はすべて省略することができます。例えば:
1 2 3 4 5 6 7 | from pyramid.response import Response
from pyramid.view import view_config
@view_config()
def my_view(request):
""" My view """
return Response()
|
上のような登録は、ビュー名が `` my_view``であり、任意のリソースタイプと一致する `` context``引数で登録され、権限を使用せず、任意のリクエストメソッド、リクエストタイプ、要求パラメタ、ルート名、または包含。
`` @ view_config``デコレータの存在だけでは、ビューの設定を行うのに十分ではありません。デコレータが行うことは、あなたの設定宣言で関数にアノテーションを付けているだけで、それを処理しません。 :app: Pyramid`があなたの:class: pyramid.view.view_config`宣言を処理するには、class :: pyramid.config.Configurator`の `scan``メソッドを使用する必要があります:
1 2 3 | # config is assumed to be an instance of the
# pyramid.config.Configurator class
config.scan()
|
class: 〜pyramid.view.view_config`のようなデコレータの使用に起因する設定宣言のために、コードがスキャンされたときの動作の詳細については、ref: decorations_and_code_scanning`を参照してください。
:meth: 〜pyramid.config.Configurator.scan`メソッドへの追加のAPI引数については:ref: configuration_module`を参照してください。たとえば、このメソッドを使うと、コードを正確に制御するための `` package``引数を指定することができます。
:class: 〜pyramid.view.view_config`デコレータへの引数はすべて、 meth: pyramid.config.Configurator.add_view`メソッドに引数として渡された場合とまったく同じことを意味します。ビュー ``引数。 :class: `〜pyramid.view.view_config`デコレータの使用法は:term:`宣言的な設定 `の形式です。:meth: pyramid.config.Configurator.add_view`は次の形式です:term: 必須の設定。しかし、どちらも同じことをしています。
`` @ view_config``の配置¶
A:class: `〜pyramid.view.view_config`デコレータは、アプリケーションのさまざまな場所に置くことができます。
ビュー呼び出し可能関数が関数である場合、それは関数デコレータとして使用できます。
1 2 3 4 5 6 | from pyramid.view import view_config
from pyramid.response import Response
@view_config(route_name='edit')
def edit(request):
return Response('edited!')
|
ビュー呼び出し可能オブジェクトがクラスである場合、デコレータはクラスデコレータとしても使用できます。デコレータに対するすべての引数は、関数に対して適用されるときと同じように、クラスに対して適用されるときと同じです。例えば:
1 2 3 4 5 6 7 8 9 10 | from pyramid.response import Response
from pyramid.view import view_config
@view_config(route_name='hello')
class MyView(object):
def __init__(self, request):
self.request = request
def __call__(self):
return Response('hello')
|
2つ以上のクラス:class: `〜pyramid.view.view_config`デコレータは、いくつでも他のものの上に積み重ねられます。各デコレータは別々のビュー登録を作成します。例えば:
1 2 3 4 5 6 7 | from pyramid.view import view_config
from pyramid.response import Response
@view_config(route_name='edit')
@view_config(route_name='change')
def edit(request):
return Response('edited!')
|
これにより、同じビューが2つの異なる名前で登録されます。
デコレータは、クラスのメソッドに対しても使用できます。
1 2 3 4 5 6 7 8 9 10 | from pyramid.response import Response
from pyramid.view import view_config
class MyView(object):
def __init__(self, request):
self.request = request
@view_config(route_name='hello')
def amethod(self):
return Response('hello')
|
デコレータがクラスのメソッドに対して使用されると、* class *のビューが登録されるので、クラスコンストラクタは引数のリストを2つの形式のうちの1つで受け入れる必要があります:一つの引数、 `` request``、引数、 ``コンテキスト、要求 ``
装飾されるメソッドは、:term: `response`を返さなければなりません。
デコレータをクラスの特定のメソッドに対して使用することは、クラス自体にアタッチされたデコレータで `` attr``パラメータを使うことと同じです。例えば、 "メソッド"メソッドに対してデコレータが使用している上記の登録は、以下のように等価的に書くことができます:
1 2 3 4 5 6 7 8 9 10 | from pyramid.response import Response
from pyramid.view import view_config
@view_config(attr='amethod', route_name='hello')
class MyView(object):
def __init__(self, request):
self.request = request
def amethod(self):
return Response('hello')
|
:meth: `〜pyramid.config.Configurator.add_view`を使ったビュー設定の追加¶
:ref: configuration_module`内の:meth: pyramid.config.Configurator.add_view`メソッドは、(必須ではありません:class: `〜pyramid.view.view_config`デコレータなしで)ビューを"必須 "に設定するために使用されます。このメソッドの引数は、class: `〜pyramid.view.view_config`デコレータに提供する引数に非常に似ています。例えば:
1 2 3 4 5 6 7 8 | from pyramid.response import Response
def hello_world(request):
return Response('hello!')
# config is assumed to be an instance of the
# pyramid.config.Configurator class
config.add_view(hello_world, route_name='hello')
|
第1引数a:term: view callable`は唯一の必須引数です。これは、ビュー自体であるPythonオブジェクトか、そのようなオブジェクトに対する:term: `点線のPython名 'のいずれかでなければなりません。上の例では、 ` view callable``は `` hello_world``関数です。
ビュー設定を追加するために:meth: 〜pyramid.config.Configurator.add_view`だけを使うときは、ビュー設定を有効にするために:term: scan`を発行する必要はありません。
`` @ view_defaults``クラスデコレータ¶
バージョン 1.3 で追加.
クラスをビューとして使用する場合は、クラスの:class: pyramid.view.view_defaults`クラスデコレータを使用して、メソッドを装飾するすべての `@ view_config``デコレータによって使用されるビュー設定情報にデフォルトを提供できますそのクラスの。
たとえば、「RESTアクション」を表すメソッドを持つクラスがある場合、これらのクラスはすべて同じルートにマッピングされますが、リクエストメソッドは異なります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from pyramid.view import view_config
from pyramid.response import Response
class RESTView(object):
def __init__(self, request):
self.request = request
@view_config(route_name='rest', request_method='GET')
def get(self):
return Response('get')
@view_config(route_name='rest', request_method='POST')
def post(self):
return Response('post')
@view_config(route_name='rest', request_method='DELETE')
def delete(self):
return Response('delete')
|
あなたはこれを行うことができます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from pyramid.view import view_defaults
from pyramid.view import view_config
from pyramid.response import Response
@view_defaults(route_name='rest')
class RESTView(object):
def __init__(self, request):
self.request = request
@view_config(request_method='GET')
def get(self):
return Response('get')
@view_config(request_method='POST')
def post(self):
return Response('post')
@view_config(request_method='DELETE')
def delete(self):
return Response('delete')
|
上記の例では、 `` @ view_defaults``クラスデコレータを使用していたので、個々の `` @ view_config``文の呼び出しから `` route_name = 'rest'``引数を取ることができました。それが所有する各ビューメソッドのデフォルトとしての引数
`` @ view_config``に渡された引数は、 `` @ view_defaults``に渡されたデフォルトを上書きします。
`` view_defaults``クラスのデコレータは、修飾されたクラスが `` view``引数としてそのディレクティブに渡されたとき、:meth: `pyramid.config.Configurator.add_view`ディレクティブにデフォルトを提供することもできます。たとえば、これの代わりに:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from pyramid.response import Response
from pyramid.config import Configurator
class RESTView(object):
def __init__(self, request):
self.request = request
def get(self):
return Response('get')
def post(self):
return Response('post')
def delete(self):
return Response('delete')
def main(global_config, **settings):
config = Configurator()
config.add_route('rest', '/rest')
config.add_view(
RESTView, route_name='rest', attr='get', request_method='GET')
config.add_view(
RESTView, route_name='rest', attr='post', request_method='POST')
config.add_view(
RESTView, route_name='rest', attr='delete', request_method='DELETE')
return config.make_wsgi_app()
|
`` config.add_view``ステートメントの繰り返し回数を減らすために、 `` route_name = 'rest'``引数を `` RESTView``クラスの `` @ view_defaults``クラスデコレータに移動できます:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | from pyramid.view import view_defaults
from pyramid.response import Response
from pyramid.config import Configurator
@view_defaults(route_name='rest')
class RESTView(object):
def __init__(self, request):
self.request = request
def get(self):
return Response('get')
def post(self):
return Response('post')
def delete(self):
return Response('delete')
def main(global_config, **settings):
config = Configurator()
config.add_route('rest', '/rest')
config.add_view(RESTView, attr='get', request_method='GET')
config.add_view(RESTView, attr='post', request_method='POST')
config.add_view(RESTView, attr='delete', request_method='DELETE')
return config.make_wsgi_app()
|
:class: pyramid.view.view_defaults`は、class: pyramid.view.view_config`と同じ引数の集合を受け入れ、それらは同じ意味を持ちます。 `` view_defaults``に渡される各引数は、装飾するクラスのメソッドのビュー設定のデフォルトを提供します。
通常のPython継承規則は、 `` view_defaults``によって追加されたデフォルトに適用されます。例えば:
1 2 3 4 5 6 | @view_defaults(route_name='rest')
class Foo(object):
pass
class Bar(Foo):
pass
|
上記の `` Bar``クラスは、 `` Foo``クラスの `` view_defaults``デコレータに渡された引数からビューのデフォルトを継承します。これを避けるには、サブクラスで引数なしで `` view_defaults``デコレータを使用してください:
1 2 3 4 5 6 7 | @view_defaults(route_name='rest')
class Foo(object):
pass
@view_defaults()
class Bar(Foo):
pass
|
`` view_defaults``デコレータはクラスデコレータとしてのみ動作します。それを関数またはメソッドに対して使用すると、無意味な結果が生成されます。
ビューセキュリティの設定¶
:term: 認証ポリシー`がアクティブな場合、ビュー検索中に見つかった:term: `view configuration`に付加された:term: permission`が検証されます。これにより、現在認証されているユーザが、view関数が実際に呼び出される前に、:term: context`リソースに対してそのパーミッションを持つことが保証されます。以下は、viewの設定でpermissionを指定する例です:meth: `〜pyramid.config.Configurator.add_view:
1 2 3 4 5 | # config is an instance of pyramid.config.Configurator
config.add_route('add', '/add.html', factory='mypackage.Blog')
config.add_view('myproject.views.add_entry', route_name='add',
permission='add')
|
:term: 認証ポリシー`が有効な場合、このビューは ` add``パーミッションで保護されます。ユーザーは、現在の:term: context`に対して add``パーミッションを持っていない場合、ビューは呼び出されません。代わりに、:term: `禁止されたビュー 'の結果は、:ref: protection_views'ごとにクライアントに返されます。
:exc: `〜pyramid.exceptions.NotFound`エラー¶
アプリケーションレジストリの設定ミスによって予期せずエラーが発生した場合、exc: 〜pyramid.exceptions.NotFound`エラーをデバッグできるようにすると便利です。これらのエラーをデバッグするには、環境変数PYRAMID_DEBUG_NOTFOUND`または ` pyramid.debug_notfound``設定ファイルの設定を使用します。ビューが見つからなかった理由の詳細は `` stderr``に出力され、エラーのブラウザ表現には同じ情報が含まれます。これらの値の設定方法と設定方法の詳細については、ref: `environment_chapter`を参照してください。
HTTPキャッシングへの影響¶
バージョン 1.1 で追加.
非 `` No`` `` http_cache``引数がビュー設定に渡されると、Pyramidは結果のレスポンスに `` Expires``と `` Cache-Control``レスポンスヘッダを設定し、ブラウザがいくつかの時間の応答データ。許容値とその意味については、:ref: nonpredicate_view_args`の `http_cache``を参照してください。
「http_cache」を持つビュー構成デコレータでビューを飾りたい場合でも、ビューからの応答を返す結果としてこれらのヘッダーを設定することは望ましくないことがあります。おそらく、キャッシュ可能ではない応答を返すビューコード内の別のブランチがありますが、通常のブランチは常にキャッシュ可能なものを返します。このような場合は、 `` response.cache_control``オブジェクトの `` prevent_auto``属性を `` False``以外の値に設定してください。たとえば、以下の呼び出し可能ビューは、ビューからの応答が3600秒間キャッシュされるべきであることを示す `` @ view_config``デコレータで構成されます。しかし、 `` should_cache`` GET変数またはPOST変数がない限り、ビュー自体はキャッシングが起こらないようにします:
from pyramid.view import view_config
@view_config(http_cache=3600)
def view(request):
response = Response()
if 'should_cache' not in request.params:
response.cache_control.prevent_auto = True
return response
`` http_cache``機構は、あなたが `` prevent_auto``を使わない限り、あなた自身が設定したキャッシングヘッダに上書きしたり追加したりすることに注意してください。
Pyramidアプリケーションの存続期間中、 `` http_cache``の効果を完全に無効にすることもできます。そのためには、 `` PYRAMID_PREVENT_HTTP_CACHE``環境変数または `` pyramid.prevent_http_cache``設定値を真の値に設定してください。詳細については、ref: `prevent_http_caching`を参照してください。
`` pyramid.prevent_http_cache``を設定しても、アプリケーションコード自身が設定するヘッダをキャッシュすることには影響しません。 `` http_cache``引数の結果として呼び出されるPyramid HTTPキャッシングマシンによって設定されていたキャッシュヘッダは、設定を表示することのみを妨げます。