【问题标题】:Only pass arguments that aren't None to Flask's url_for只将不是 None 的参数传递给 Flask 的 url_for
【发布时间】:2019-04-17 00:43:11
【问题描述】:

我目前正在尝试使用关键字和表单 GET 方法在 Flask 中设置搜索。

为了处理分页,我必须将过滤器的所有关键字传递给url_for 以获取下一页或最后一页。但是,有时这些关键字并不是必需的,只会使 url 栏变得混乱。

{{ url_for(request.endpoint, page=pagination.next_num, searchTerm=searchTerm, blendLicense=blendLicense, renderEngine=renderEngine, blenderVersion=blenderVersion) }}

有没有办法只传递不是None 的关键字,以免弄乱网址栏?如果只检查一个关键字,我会使用if else 块,但要检查的关键字很多。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    像这样执行调用:

    kwargs = dict(searchTerm=searchTerm,
                  blendLicense=blendLicense,
                  renderEngine=renderEngine,
                  blenderVersion=blenderVersion)
    
    url_for(request.endpoint, page=pagination.next_num, **kwargs)
    

    这与您问题中的代码相同。 但是现在你可以方便地过滤掉一个默认值,比如None

    def filter_default(kwargs):
        return {k: v
                for k, v in kwargs.items()
                if v}
    

    (或者,如果可能存在空字符串等值,则使用if v is not None。)

    在传入字典之前将该过滤函数应用于字典。

    编辑

    {{ url_for(request.endpoint,
               page=pagination.next_num,
               **filter_default(dict(searchTerm=searchTerm,
                                     blendLicense=blendLicense,
                                     renderEngine=renderEngine,
                                     blenderVersion=blenderVersion))) }}
    

    【讨论】:

      【解决方案2】:

      url_for 已经忽略了 None 的关键字。除此之外,您无需执行任何操作。

      @app.route("/search")
      def search():
          ...
      
      url_for("search", name="Flask", page=2))
      "/search?name=Flask&page=2"
      url_for("search", name="Flask", page=None))
      "/search?name=Flask"
      

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2016-10-18
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多