除了将发送到视图的根 url 请求之外,我还想要一个调度程序,我将根据我的自定义调度程序规则将所有请求路由到我将选择的不同视图。
如何创建调度程序?我一遍又一遍地阅读文档,但我无法弄清楚。
我想解析 url 的 *remainder,然后相应地发送请求。
除了将发送到视图的根 url 请求之外,我还想要一个调度程序,我将根据我的自定义调度程序规则将所有请求路由到我将选择的不同视图。
如何创建调度程序?我一遍又一遍地阅读文档,但我无法弄清楚。
我想解析 url 的 *remainder,然后相应地发送请求。
Pyramid 会将请求分派到通过add_view
或注册的视图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()
无论如何,应该清楚的是,这是一个框架之上的框架,并且在很多情况下可能是代码异味。
这实际上取决于结构或您的 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
然后您可以为and注册视图VegetableResource
:
@view_config(context=FruitResource):
def view_fruit(context, request):
...
@view_config(context=VegetableResource):
def view_vegetable(context, request):
...
您可以为水果和蔬菜注册不同的视图集,因此/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
andVegetableResource
可以有他们自己的__getitem__
方法,所以你可以有可能不同的“子项”集 -/food/banana/skin
等等/food/banana/flesh
,他们自己的视图分配给他们 - /food/banana/skin/peel
, /food/banana/flesh/eat
, wherepeel
和eat
are views 注册为 imaginary FruitSkinResource
and FruitFleshResource
。
而且您可以对水果和蔬菜拥有自定义权限,因此访问/food/apple/make_jam
可能需要一个权限和/food/potato/make_soup
另一个权限。
我认为您可以使用金字塔的事件系统文档,这看起来像 hack,但我认为这是最简单的方法。