Pyramid:为route_url构造的每个URL扩展查询字符串

时间:2013-02-22 16:50:18

标签: python web-applications url-routing pyramid

我正在使用Web框架金字塔和URL调度,我在其中定义了许多路径,如

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

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

构造的URL
request.route_url('login')

实际上是

/login?foo=bar

这应该在项目基础上完成,以避免编写

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

每次我想构建一个URL。

这是什么地方?我应该以某种方式继承pyramid.request类并覆盖route_url方法吗?是否有可以使用的事件或钩子?

2 个答案:

答案 0 :(得分:3)

您可以定义预生成器并将其分配给路线。

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

基本上,只要你调用request.route_url之类的东西,就会调用预生成器,并传递元素和kwargs,允许你在实际生成url之前改变它们。

答案 1 :(得分:0)

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

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)

它还可以构建没有隐藏的URL。