我正在使用Web框架金字塔和URL调度,我在其中定义了许多路径,如
config.add_route('login', '/login')
config.add_route('logout', '/logout')
现在我想在查询字符串中添加一些内容,例如由
构造的URLrequest.route_url('login')
实际上是
/login?foo=bar
这应该在项目基础上完成,以避免编写
request.route_url('login', _query={'foo': 'bar'})
每次我想构建一个URL。
这是什么地方?我应该以某种方式继承pyramid.request类并覆盖route_url方法吗?是否有可以使用的事件或钩子?
答案 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。