4

我正在使用 Webframework Pyramid 和 URL Dispatch,我在其中定义了很多路由,例如

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

现在我想在查询字符串中附加一些东西,例如由

request.route_url('login')

实际上是

/login?foo=bar

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

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

每次我想构建一个 URL。

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

4

2 回答 2

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 之前对它们进行变异。

于 2013-02-23T06:20:41.243 回答
0

基于this site上的讨论,我实现了以下解决方案:

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 的可能性。

于 2013-02-23T18:16:00.913 回答