ピラミッドのリソースとコンテキストを理解する
-
28-10-2019 - |
質問
私はピラミッドを始めたばかりなので、私と一緒に我慢してください。私はピラミッドのコンテキストとリソースを理解するのに苦労しています。 URLディスパッチ. 。ドキュメントの説明からそれが何を意味するのかよくわかりません。コンテキストとリソースはやや循環的です(私にとって)。
- ピラミッドのリソースは何ですか?それはURLが表現しようとしていることだけですか?たとえば、URLの場合
/organization/add_users
, 、リソース組織ですか、それともユーザーですか? - コンテキストは上記の例の組織もありますか?
また、
- コンテキストオブジェクトとは正確には何ですか?
コンテキストオブジェクトは何を含むはずですか?チュートリアルの例にはACLのみがあり、initメソッドには何もありません。
class RootFactory(object): __acl__ = [(...some permissions...)] def __init__(self): pass
例外が(たとえば禁止されている)場合、コンテキストはどの時点で正確に変更されますか?
禁止されたエラーのようなものがあるときにコンテキストの変更の目的を見ることができますが、検証のようなことをするとき、なぜ別のview_callableで登録されている例外をスローする必要があります。例外をスローする代わりに、同じView_Callable内の別のテンプレートにレンダリングしますか? (ドキュメントでadd_viewの検証エラーの例を見ました)
解決
まず第一に、URLディスパッチを使用するときにこのことを気にしたい主な理由は、Pyramidの認証システムを使用する目的であることです。それを気にしない場合は、コンテキストとリソースツリーを完全に無視して、ディスパッチを続けることができます。
リソースツリー
Pyramidには、リソースツリーのユニークな概念があります。これは、文字通りパスにマッピングされるオブジェクトの木です。このツリーは、ルートから供給されたパスの端まで横断されます。パスが使い果たされているか、ツリーが休暇ノードにヒットした場合、トラバーサル中に、ツリー内のそのオブジェクトが今 context
.
URLディスパッチでは、トラバーサルは(デフォルトでは)発生しません。したがって、コンテキストは常にリソースツリーのルートになります。
一般に、アプリケーションで必要なものにコンテキストを使用できます。 AclauthorizationPolicyによって明示的に使用され、権限が決定されます。これは全体のトピックです。Pyramidの認証システムをURLディスパッチで使用する方法を説明するデモをチェックすることをお勧めします[1].
例外
ピラミッドでの例外処理は、2つの異なる方法で行われます。
- 使用できます
try: except:
別の応答を返すというあなたの見解では。 - 例外ビューを利用して、より一般的にはアプリ内の例外を処理できます。
404ページのレンダリングには2番目の方法が必要であり、Pyramidの認証を使用している場合は禁止ページも必要です。これは、ピラミッドが内部的に、それらをカスタマイズしたい場合にキャッチしてレンダリングする必要があるため、発見されていない禁止された例外をスローするためです。
例外がスローされ、そのタイプに一致するように登録された例外ビューがある場合、ピラミッドは例外ビューを呼び出し、例外で新しいコンテキストとして渡すため、コンテキストが変更されます。
検証が例外ビューの良い例であるかどうかはわかりません。より通常、ビューはエラーケース、またはアプリケーションの非ビュー部分での短絡実行に使用されます。たとえば、ビューがデータベースに接続できない場合、または4xxまたは5xxの応答を返す場合に、さまざまなページを処理および返信することができます。デフォルトでは、例外が処理されていない場合、WSGIサーバーは一般的な500ページに変換されます。例外ビューでは、その動作をカスタマイズできます。
これらすべてからの重要なポイントは、それがすべてオプションであることです。混乱している場合は、これらのことなくピラミッドを利用できるため、心配しないでください。また、より快適になると、アプリケーションに組み込むことができます。
他のヒント
ここでの例が役に立ちません: http://docs.pylonsproject.org/projects/pyramid/1.1/tutorials/wiki2/authorization.html#adding-login-and-logout-views 間違っています。
スローされた例外(少なくともピラミッド1.0-2に関連するように)は、pyramid.exceptions.forbiddenです。例のpyramid.httpexceptions.httpforbiddenではありません。
しかし、チュートリアルでそのひっかかったとき、私は他のいくつかの有用なものがどこにあるかを学びました。