0

ビューに送信されるルートURLリクエストに加えて、カスタムディスパッチャーのルールに応じて選択するさまざまなビューにすべてのリクエストをルーティングするディスパッチャーが必要です。

ディスパッチャを作成するにはどうすればよいですか?私は何度も何度もドキュメントを読みましたが、それを理解することはできません。

urlの*remainderを解析し、それに応じてリクエストをディスパッチしたいと思います。

4

3 に答える 3

1

それは実際には構造または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):
    ...

次に、FruitResourceVegetableResourceは独自のメソッドを持つことができるため、独自のビューが割り当てられた__getitem__「サブアイテム」などの潜在的に異なるセットを持つことができます。ここで、およびは虚数および。に登録されたビューです。/food/banana/skin/food/banana/flesh/food/banana/skin/peel/food/banana/flesh/eatpeeleatFruitSkinResourceFruitFleshResource

また、果物や野菜のカスタム権限を持つことができるため、アクセスには1つの権限と別の/food/apple/make_jam権限が必要になる場合があります。/food/potato/make_soup

于 2012-06-21T22:09:38.590 に答える
1

add_viewPyramid は、またはを介し​​て登録されたビューにリクエストをディスパッチし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()

とにかく、これがフレームワークの上にあるフレームワークであり、多くの場合、おそらくコードのにおいがすることは明らかです。

于 2012-06-21T15:47:35.030 に答える
0

ハックのように見えるピラミッドのイベントシステムドキュメントを使用できると思いますが、それが最も簡単な方法だと思います。

于 2012-06-21T13:57:27.573 に答える