【问题标题】:Pyramid: Default values in route pattern金字塔:路由模式中的默认值
【发布时间】:2012-05-09 02:57:37
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

    标签: python url pyramid routes


    【解决方案1】:

    您可能对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')
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢,剩下的比赛我错过了
      【解决方案3】:

      设置它的一种(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),))
      

      【讨论】:

        【解决方案4】:

        我无法让 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-03
          • 2021-10-10
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2019-07-19
          • 1970-01-01
          • 2021-05-14
          相关资源
          最近更新 更多