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

4 投票
2 回答
1033 浏览
提问于 2025-04-17 16:47

我正在使用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 之类的函数时,预生成器就会被调用,并且会接收到一些元素和参数,这样你就可以在实际生成网址之前对它们进行修改。

撰写回答