金字塔:如何创建 - 使用自定义调度程序?

时间:2012-06-21 13:34:09

标签: python python-2.7 pyramid

除了将发送到视图的根URL请求之外,我想要一个调度程序,我将把所有请求路由到我将根据我的自定义调度程序规则选择的不同视图。

如何创建调度程序?我一遍又一遍地阅读文档,但我无法理解。

我想解析url的剩余部分,然后相应地发送请求。

3 个答案:

答案 0 :(得分:1)

Pyramid会将请求发送到通过add_viewview_config注册的视图。如果你想再次将它发送到你自己的代码,请记住,从Pyramid的角度来看,将使用在原始视图上定义的渲染器/权限......所以不要使用它们。该请求有效地进入您的金字塔视图,然后您有自己的迷你框架,将从那里处理它。

我建议考虑如何在Pyramid视图的上下文中调度事物,例如pyramid_rpc包根据RPC请求正文中的内容(而不仅仅是URL)。查看add_jsonrpc_method中的自定义谓词,了解我在说什么。

无论如何,假设你仍然想做自己的事情,你所要做的就是在金字塔中注册一个你想要的任何模式的视图。

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()

无论如何,应该很清楚,这是一个框架之上的框架,在很多情况下可能是代码嗅觉。

答案 1 :(得分:1)

这实际上取决于结构或您的URLS和“自定义调度程序规则”,但在许多情况下,您可以使用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)

然后您可以注册FruitResourceVegetableResource的观看次数:

@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将仅为水果的虚拟网址,以及您将拥有的蔬菜,例如{{1} }:

/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/eatpeel是为虚构eatFruitSkinResource注册的观看次数

您可以拥有水果和蔬菜的自定义权限,因此访问FruitFleshResource可能需要一个权限,/food/apple/make_jam另一个权限。

答案 2 :(得分:0)

我认为你可以使用金字塔的事件系统docs这看起来像黑客,但我认为这是最简单的方法。