Flask可以有可选的URL参数吗?


258

是否可以直接声明Flask URL可选参数?

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

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

我如何直接说这username是可选的?

Answers:


341

另一种方法是写

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

但是我想您想编写一条路由并将其标记username为可选?如果是这样,我认为不可能。


引用端点和url_for时使用此方法有任何问题吗?

2
从来没听说过。甚至Flask 文档都包含类似的示例(您需要向下滚动才能看到它)。
AudriusKažukauskas13年

1
您可以尝试pip install flask_optional_routes。我为您要求的功能创建了一个pip,我也需要它。该代码位于:github.com/sudouser2010/flask_optional_routes
sudouser2010 '18

赞!如果您的主页上有多个选项卡,每个选项卡都触发类似/ one / two / three / four之类的内容,并且您想在同一页面上加载不同的内容而不重新加载该页面,那么您应该使用一条还是多条路线?
PirateApp '18

仅靠Flask无法实现的@PirateApp纯粹是一个前端功能
qaisjp

183

几乎与几个月前完成的Audrius一样,但是您可能会发现它与函数头中的默认设置相比更具可读性-习惯于python:

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

3
同样,如果username不是恒定的,这也有效。defaults=将默认值冻结在字典中。
kasperhj 2014年

2
我喜欢这个。我们应该保持代码尽可能干净。
Light.G

请记住,这里有一个很大的警告:如果您有多个位置参数,而并非所有位置参数都是可选的,则flask将无法理解如何正确构建URL。您可以获得类似/ page?arg = foo的名称,该名称应为/ foo / page。@AudriusKažukauskas回答在这种情况下有效,但这不起作用
rgargente

73

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

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

然后在您的Resource类中:

class UserAPI(Resource):

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


11
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

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


3
您应该在此处添加来自外部链接的信息,因为如果该链接不再有效,您的答案将被损坏。
tomab 2015年

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

5

与skornos几乎相同,但具有变量声明以提供更明确的答案。它可以与Flask-RESTful扩展一起使用

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。每个将被路由到您的资源


1

我知道这篇文章确实很老,但是我从事的是一个名为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)

0

您可以按照示例中所示进行编写,但是会遇到构建错误。

要解决此问题:

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

<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>

<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>

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

-6

从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

5
什么?在这里使用烧瓶0.10.1,我可以将多个路由添加到一个端点。
jaapz 2014年

-8

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

例:

from flask import Blueprint

bp = Blueprint(__name__, "example")

@bp.route("/example", methods=["POST"])
def example(self):
   print("example")

这不能回答问题。
meyer9 2007年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.