Pyramid:为每个通过route_url构建的URL扩展查询字符串
我正在使用Web框架Pyramid和URL调度,在这里我定义了很多路由,比如
config.add_route('login', '/login')
config.add_route('logout', '/logout')
现在我想在查询字符串中添加一些内容,这样通过
request.route_url('login')
构建出来的URL实际上变成
/login?foo=bar
这样做是为了项目的方便,避免每次构建URL时都要写
request.route_url('login', _query={'foo': 'bar'})
这些代码。
我应该在哪里做这个呢?我是不是应该从pyramid.request类继承,并重写route_url方法?有没有什么事件或钩子可以使用?
2 个回答
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)
这个方案还可以让我们构建不带hid的URL。
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
之类的函数时,预生成器就会被调用,并且会接收到一些元素和参数,这样你就可以在实际生成网址之前对它们进行修改。