【问题标题】:Can Flask have optional URL parameters?Flask 可以有可选的 URL 参数吗?
【发布时间】:2012-12-11 12:12:24
【问题描述】:

是否可以直接声明一个flask URL可选参数?

目前我正在按照以下方式进行:

@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

我怎么能直接说username是可选的?

【问题讨论】:

    标签: python flask


    【解决方案1】:
    @user.route('/<userId>/')  # NEED '/' AFTER LINK
    @user.route('/<userId>/<username>')
    def show(userId, username=None):
        pass
    

    https://flask.palletsprojects.com/en/1.1.x/quickstart/#unique-urls-redirection-behavior

    【讨论】:

    • @iwasborntobleed thnx man,花几个小时找出“/”作为后缀
    【解决方案2】:

    几乎与 skornos 相同,但使用变量声明以获得更明确的答案。它可以与Flask-RESTful extension一起使用:

    from flask import Flask
    from flask_restful import Resource, Api
    
    app = Flask(__name__)
    api = Api(app)
    
    class UserAPI(Resource):
        def show(userId, username=None):
        pass
    
    api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint='user')
    
    if __name__ == '__main__':
        app.run()
    

    add_resource 方法允许传递多个 URL。每一个都将被路由到您的Resource

    【讨论】:

      【解决方案3】:

      我知道这篇文章很老,但我开发了一个名为 flask_optional_routes 的包。代码位于:https://github.com/sudouser2010/flask_optional_routes

      from flask import Flask
      
      from flask_optional_routes import OptionalRoutes
      
      
      app = Flask(__name__)
      optional = OptionalRoutes(app)
      
      @optional.routes('/<user_id>/<user_name>?/')
      def foobar(user_id, user_name=None):
          return 'it worked!'
      
      if __name__ == "__main__":
          app.run(host='0.0.0.0', port=5000)
      

      【讨论】:

        【解决方案4】:
        @app.route('/', defaults={'path': ''})
        @app.route('/< path:path >')
        def catch_all(path):
            return 'You want path: %s' % path
        

        http://flask.pocoo.org/snippets/57/

        【讨论】:

        【解决方案5】:

        我认为您可以使用蓝图,这将使您的代码看起来更好、更整洁。

        示例:

        from flask import Blueprint
        
        bp = Blueprint(__name__, "example")
        
        @bp.route("/example", methods=["POST"])
        def example(self):
           print("example")
        

        【讨论】:

        • 这没有回答问题。
        【解决方案6】:
        @user.route('/<user_id>', defaults={'username': default_value})
        @user.route('/<user_id>/<username>')
        def show(user_id, username):
           #
           pass
        

        【讨论】:

          【解决方案7】:

          如果你和我一样使用 Flask-Restful,也可以这样:

          api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')
          

          然后在您的资源类中:

          class UserAPI(Resource):
          
            def get(self, userId, username=None):
              pass
          

          【讨论】:

            【解决方案8】:

            您可以按照示例中的方式编写,但会出现构建错误。

            为了解决这个问题:

            1. 在你的root .py中打印app.url_map()
            2. 您会看到如下内容:

            &lt;Rule '/&lt;userId&gt;/&lt;username&gt;' (HEAD, POST, OPTIONS, GET) -&gt; user.show_0&gt;

            &lt;Rule '/&lt;userId&gt;' (HEAD, POST, OPTIONS, GET) -&gt; .show_1&gt;

            1. 比在模板中你可以{{ url_for('.show_0', args) }}{{ url_for('.show_1', args) }}

            【讨论】:

              【解决方案9】:

              从 Flask 0.10 开始,您无法将多个路由添加到一个端点。但是你可以添加假端点

              @user.route('/<userId>')
              def show(userId):
                 return show_with_username(userId)
              
              @user.route('/<userId>/<username>')
              def show_with_username(userId,username=None):
                 pass
              

              【讨论】:

              • 什么?在这里使用flask 0.10.1,我可以将多个路由添加到一个端点就好了。
              【解决方案10】:

              与几个月前 Audrius 制作的几乎相同,但您可能会发现函数头中的默认值更具可读性 - 就像您习惯使用 python 的方式:

              @app.route('/<user_id>')
              @app.route('/<user_id>/<username>')
              def show(user_id, username='Anonymous'):
                  return user_id + ':' + username
              

              【讨论】:

              • 此外,如果username 不是恒定的,则此方法有效。 defaults= 冻结字典中的默认值。
              • 我更喜欢这个。我们应该尽可能保持代码干净。
              • 请记住,这里有一个很大的警告:如果您有多个位置参数并且并非所有参数都是可选的,flask 将无法理解如何正确构建 URL。你可以得到类似 /page?arg=foo 的东西,它应该是 /foo/page 。 @Audrius Kažukauskas 的答案在这种情况下有效,但这不是
              【解决方案11】:

              还有一种写法

              @user.route('/<user_id>', defaults={'username': None})
              @user.route('/<user_id>/<username>')
              def show(user_id, username):
                  pass
              

              但我猜你想写一个单一的路线并将username标记为可选?如果是这样的话,我认为这是不可能的。

              【讨论】:

              • 在引用端点和 url_for 时使用此方法有什么问题吗?
              • 我不知道。甚至 Flask docs 也包含类似的示例(您需要向下滚动一下才能看到它)。
              • 你可以试试 pip install flask_optional_routes。我为您请求 b/c 的功能创建了一个 pip,我也需要它。代码位于:github.com/sudouser2010/flask_optional_routes.
              • 点赞!如果您的主页上有多个选项卡,每个选项卡都会触发 /one /two /three /four 之类的内容,并且您想在同一页面上加载不同的内容而不重新加载页面,您应该使用单个路由还是多个路由?
              • @PirateApp 仅靠 Flask 无法实现,纯粹是前端功能
              猜你喜欢
              • 1970-01-01
              • 2013-07-04
              • 2011-04-15
              • 2016-03-25
              • 1970-01-01
              • 1970-01-01
              • 2019-04-25
              • 2011-04-06
              • 2019-12-06
              相关资源
              最近更新 更多