ビューに送信されるルートURLリクエストに加えて、カスタムディスパッチャーのルールに応じて選択するさまざまなビューにすべてのリクエストをルーティングするディスパッチャーが必要です。
ディスパッチャを作成するにはどうすればよいですか?私は何度も何度もドキュメントを読みましたが、それを理解することはできません。
urlの*remainderを解析し、それに応じてリクエストをディスパッチしたいと思います。
ビューに送信されるルートURLリクエストに加えて、カスタムディスパッチャーのルールに応じて選択するさまざまなビューにすべてのリクエストをルーティングするディスパッチャーが必要です。
ディスパッチャを作成するにはどうすればよいですか?私は何度も何度もドキュメントを読みましたが、それを理解することはできません。
urlの*remainderを解析し、それに応じてリクエストをディスパッチしたいと思います。
それは実際には構造またはURLと「カスタムディスパッチャルール」に依存しますが、多くの場合、URLディスパッチャの代わりにURLトラバーサルを使用して目的を達成できます。URLトラバーサルは__getitem__
、通常のPythonコードを記述できる親リソースのメソッドを使用するため、柔軟性が向上する可能性があります。
例:次のURLがあるとします。
/food/banana
/food/potato
/food/tomato
/food/apple
果物と野菜について異なる見方をしたいと考えています。あなたはこのようなことをすることができます:
class FoodResource(object):
def __getitem__(self, name):
if name in ["banana", "apple"]:
return FruitResource(self, name)
if name in ["potato", "tomato"]:
return VegetableResource(self, name)
FruitResource
次に、およびのビューを登録できますVegetableResource
。
@view_config(context=FruitResource):
def view_fruit(context, request):
...
@view_config(context=VegetableResource):
def view_vegetable(context, request):
...
FruitsとVegetablesに異なるビューのセットを登録できるため/foor/banana/make_jam
、/food/apple/make_jam
果物のみのURLが利用可能になり、野菜の場合は次のようになります/food/potato/make_soup
。
@view_config(context=FruitResource, name="make_jam"):
def view_fruit_make_jam(context, request):
...
@view_config(context=VegetableResource, name="make_soup"):
def view_vegetable_make_soup(context, request):
...
次に、FruitResource
とVegetableResource
は独自のメソッドを持つことができるため、独自のビューが割り当てられた__getitem__
「サブアイテム」などの潜在的に異なるセットを持つことができます。ここで、およびは虚数および。に登録されたビューです。/food/banana/skin
/food/banana/flesh
/food/banana/skin/peel
/food/banana/flesh/eat
peel
eat
FruitSkinResource
FruitFleshResource
また、果物や野菜のカスタム権限を持つことができるため、アクセスには1つの権限と別の/food/apple/make_jam
権限が必要になる場合があります。/food/potato/make_soup
add_view
Pyramid は、またはを介して登録されたビューにリクエストをディスパッチしview_config
ます。これを自分のコードに再度ディスパッチしたい場合は、Pyramid の観点から、元のビューで定義されたレンダラー/パーミッションが使用されることを覚えておいてください...したがって、それらを使用しないでください。リクエストは効果的に Pyramid ビューに入り、そこからそれを処理する独自のミニ フレームワークができます。
Pyramid ビューのコンテキストでディスパッチする方法を検討することをお勧めします。たとえば、pyramid_rpc
パッケージは RPC リクエストの本文 (URL だけでなく) のコンテンツに基づいてビューにディスパッチするためのいくつかの優れた機能を実行します。add_jsonrpc_method内のカスタム述語を参照して、私が話していることを理解してください。
とにかく、あなたがまだ自分のことをやりたいと仮定すると、あなたがしなければならないことは、あなたが望むどんなパターンでも Pyramid にビューを登録することだけです。
config.add_route('my_framework', '/foo/{the_rest:.*}')
@view_config(route_name='my_framework')
def my_framework_view(request):
url = request.matchdict['the_rest']
# do your frameworky stuff here
if url == 'foo/bar':
return some_other_view(request)
return HTTPNotFound()
とにかく、これがフレームワークの上にあるフレームワークであり、多くの場合、おそらくコードのにおいがすることは明らかです。
ハックのように見えるピラミッドのイベントシステムドキュメントを使用できると思いますが、それが最も簡単な方法だと思います。