2024-03-29 13:31:15 发布
网友
除了将被发送到视图的根url请求之外,我还希望有一个调度器,它可以将所有请求路由到不同的视图,这些视图将取决于我的自定义调度程序规则。
如何创建调度程序?我把文件看了一遍又一遍,但还是搞不懂。
我想解析url的*剩余部分,然后相应地发送请求。
它实际上取决于结构或您的URL和您的“自定义调度规则”,但在许多情况下,您可以使用URL遍历而不是URL分派来实现您想要的。由于URL遍历使用父资源的__getitem__方法,您可以在其中编写普通的Python代码,因此它可能会给您带来更大的灵活性。在
__getitem__
示例:假设您有以下URL:
/food/banana /food/potato /food/tomato /food/apple
你想对水果和蔬菜有不同的看法。你可以这样做:
然后可以注册FruitResource和VegetableResource的视图:
FruitResource
VegetableResource
@view_config(context=FruitResource): def view_fruit(context, request): ... @view_config(context=VegetableResource): def view_vegetable(context, request): ...
您可以为水果和蔬菜注册不同的视图集,因此/foor/banana/make_jam和{}将仅是水果的有效URL,对于蔬菜,您将有,例如,/food/potato/make_soup:
/foor/banana/make_jam
/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,其中{}和{}是为假想的{}和{}注册的视图。在
/food/banana/skin
/food/banana/flesh
/food/banana/skin/peel
/food/banana/flesh/eat
而且您可以对水果和蔬菜具有自定义权限,因此访问/food/apple/make_jam可能需要一个权限,/food/potato/make_soup可能需要另一个权限。在
/food/apple/make_jam
我想你可以使用金字塔的事件系统docs这看起来像黑客,但我认为这是最简单的方法。在
金字塔将把请求发送到通过add_view或view_config注册的视图。如果您想再次将其分派到您自己的代码中,请记住,从金字塔的角度来看,将使用在原始视图上定义的呈现器/权限。。。所以不要用那些。请求有效地进入了金字塔视图,然后你就有了自己的小框架来处理它。在
add_view
view_config
我建议考虑如何在金字塔视图的上下文中分派内容,例如,pyramid_rpc包会根据RPC请求主体中的内容(而不仅仅是URL)执行一些很酷的任务来分派到视图。请参阅add_jsonrpc_method中的自定义谓词,以了解我在说什么。在
pyramid_rpc
不管怎样,假设你还想做你自己的事情,你所要做的就是在金字塔中注册一个你想要的模式的视图。在
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()
无论如何,应该清楚的是,这是一个框架之上的框架,在很多情况下可能是一种代码味道。在
它实际上取决于结构或您的URL和您的“自定义调度规则”,但在许多情况下,您可以使用URL遍历而不是URL分派来实现您想要的。由于URL遍历使用父资源的
__getitem__
方法,您可以在其中编写普通的Python代码,因此它可能会给您带来更大的灵活性。在示例:假设您有以下URL:
你想对水果和蔬菜有不同的看法。你可以这样做:
^{pr2}$然后可以注册
FruitResource
和VegetableResource
的视图:您可以为水果和蔬菜注册不同的视图集,因此}将仅是水果的有效URL,对于蔬菜,您将有,例如,
/foor/banana/make_jam
和{/food/potato/make_soup
:那么您的}和{}是为假想的{}和{}注册的视图。在
FruitResource
和VegetableResource
可以有它们自己的__getitem__
方法,因此您可以有潜在的不同的“子项”集/food/banana/skin
,/food/banana/flesh
等,并为它们分配各自的视图-/food/banana/skin/peel
,/food/banana/flesh/eat
,其中{而且您可以对水果和蔬菜具有自定义权限,因此访问
/food/apple/make_jam
可能需要一个权限,/food/potato/make_soup
可能需要另一个权限。在我想你可以使用金字塔的事件系统docs这看起来像黑客,但我认为这是最简单的方法。在
金字塔将把请求发送到通过
add_view
或view_config
注册的视图。如果您想再次将其分派到您自己的代码中,请记住,从金字塔的角度来看,将使用在原始视图上定义的呈现器/权限。。。所以不要用那些。请求有效地进入了金字塔视图,然后你就有了自己的小框架来处理它。在我建议考虑如何在金字塔视图的上下文中分派内容,例如,
pyramid_rpc
包会根据RPC请求主体中的内容(而不仅仅是URL)执行一些很酷的任务来分派到视图。请参阅add_jsonrpc_method中的自定义谓词,以了解我在说什么。在不管怎样,假设你还想做你自己的事情,你所要做的就是在金字塔中注册一个你想要的模式的视图。在
无论如何,应该清楚的是,这是一个框架之上的框架,在很多情况下可能是一种代码味道。在
相关问题 更多 >
编程相关推荐