金字塔:路径模式中的默认值

时间:2012-04-28 18:13:27

标签: python url pyramid routes

我想知道:
是否可以在路径配置模式中提供默认值?
例如:我有一个视图,显示绑定到数据集的(可能很大)文件列表。 我想在页面中拆分视图,每个页面显示100个文件。当省略url模式中的页面部分时,我希望显示第一页 所以我希望有类似的东西:

config.add_route('show_files', '/show_files/{datasetid}/{page=1})

那是合理的努力还是替代方案? 我没有在金字塔文档中的路由语法描述中找到任何内容。

非常感谢!

4 个答案:

答案 0 :(得分:12)

您可能满足于this answer,但另一种选择是使用分配到同一视图的多条路线。

config.add_route('show_files', '/show_files/{datasetid}')
config.add_route('show_files:page', '/show_files/{datasetid}/{page}')

@view_config(route_name='show_files')
@view_config(route_name='show_files:page')
def show_files_view(request):
    page = request.matchdict.get('page', '1')

答案 1 :(得分:2)

不,但您可以使用余数匹配使页面可选,然后决定在实际逻辑中显示哪个页面。

http://readthedocs.org/docs/pyramid/en/master/narr/urldispatch.html

另一种选择是让您的页面成为GET变量而不是URL的一部分。

答案 2 :(得分:1)

(hacky)设置方法是使用custom predicate。明确允许更改matchdict。

def matchdict_default(**kw):
    def f(info, request):
        for k, v in kw.iteritems():
            info['match'].setdefault(k, v)
        return True
    return f

config.add_route(
    'show_files', 
    '/show_files/{datasetid}/{page}')
config.add_route(
    'show_files', 
    '/show_files/{datasetid}', 
    custom_predicates=(matchdict_default(page=1),))

答案 3 :(得分:0)

我无法让Thomas Jungs的榜样奏效。我能够通过迭代密钥而不使用iteritems()来获得Thomas Jung的例子。

def matchdict_default(**kw):
def f(info, request):
    for k in kw:
        info['match'].setdefault(k, kw[k])
    return True
return f

config.add_route(
'show_files', 
'/show_files/{datasetid}/{page}')
config.add_route(
'show_files', 
'/show_files/{datasetid}', 
custom_predicates=(matchdict_default(page=1),))`

now both of the following urls resolve to the page value, and, urls
can be created without needing to include a query
parameter

/show_files/an_id/
/show_files/an_id/?page=1