金字塔:扩展由route\u构造的每个URL的查询字符串

2024-06-08 22:29:58 发布

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

我使用的是Webframework金字塔和URL分派,在这里我定义了很多路由,比如

config.add_route('login', '/login')
config.add_route('logout', '/logout')

现在我想在查询字符串中附加一些内容,比如由

^{pr2}$

实际上是

/login?foo=bar

这应该在项目的基础上进行,以避免写作

request.route_url('login', _query={'foo': 'bar'})

每次我想建立一个网址。在

在什么地方做这件事是正确的?我应该继承金字塔。请求初始化并重写route\u url方法?有什么事件或钩子可以用吗?在


Tags: 字符串addconfigurl分派路由内容定义
2条回答

您可以定义一个pregenerator并将其指定给您的路由。在

def add_query_pregen(request, elements, kwargs):
    query = kwargs.setdefault('_query', {})
    query.setdefault('foo', 'bar')
    return elements, kwargs

def add_route_with_query(*args, **kwargs):
    kwargs['pregenerator'] = add_query_pregen
    config.add_route(*args, **kwargs)

add_route_with_query('login', '/login')
add_route_with_query('logout', '/logout')

基本上,pregenerator在您调用request.route_url等任何时候都会被调用,并传递元素和kwarg,允许您在实际生成url之前对它们进行变异。在

根据本网站的讨论,我实现了以下解决方案:

from pyramid.request import Request as OldRequest

class Request(OldRequest):
    def route_url(self, route_name, *elements, **kw):
        qs = kw.get('_query', {})
        if 'hid' in qs: raise Exception('hid exists in query string')
        qs['hid'] = 1337
        kw['_query'] = qs
        return self.route_without_hid(route_name, *elements, **kw)

    def route_url_without_hid(self, route_name, *elements, **kw):
        return super(Request, self).route_url(route_name, *elements, **kw)

这也使得构建没有hid的url成为可能。在

相关问题 更多 >