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

2024-03-29 13:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

除了将被发送到视图的根url请求之外,我还希望有一个调度器,它可以将所有请求路由到不同的视图,这些视图将取决于我的自定义调度程序规则。

如何创建调度程序?我把文件看了一遍又一遍,但还是搞不懂。

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


Tags: 文件程序视图url路由规则调度
3条回答

它实际上取决于结构或您的URL和您的“自定义调度规则”,但在许多情况下,您可以使用URL遍历而不是URL分派来实现您想要的。由于URL遍历使用父资源的__getitem__方法,您可以在其中编写普通的Python代码,因此它可能会给您带来更大的灵活性。在

示例:假设您有以下URL:

/food/banana
/food/potato
/food/tomato
/food/apple

你想对水果和蔬菜有不同的看法。你可以这样做:

^{pr2}$

然后可以注册FruitResourceVegetableResource的视图:

@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

@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/eat,其中{}和{}是为假想的{}和{}注册的视图。在

而且您可以对水果和蔬菜具有自定义权限,因此访问/food/apple/make_jam可能需要一个权限,/food/potato/make_soup可能需要另一个权限。在

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

金字塔将把请求发送到通过add_viewview_config注册的视图。如果您想再次将其分派到您自己的代码中,请记住,从金字塔的角度来看,将使用在原始视图上定义的呈现器/权限。。。所以不要用那些。请求有效地进入了金字塔视图,然后你就有了自己的小框架来处理它。在

我建议考虑如何在金字塔视图的上下文中分派内容,例如,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()

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

相关问题 更多 >