Flask approute中的多个参数

80 投票
8 回答
132420 浏览
提问于 2025-04-17 17:44

如果我在网址调用中有多个参数,应该怎么写flask的app.route呢?

这是我从AJax调用的URL:

http://0.0.0.0:8888/createcm?summary=VVV&change=Feauure

我试着这样写我的flask app.route

@app.route('/test/<summary,change>', methods=['GET']

但是这样不行。有没有人能告诉我应该怎么写app.route

8 个回答

28

路由不会匹配查询字符串,这个查询字符串是直接传递给你的方法的。

from flask import request

@app.route('/createcm', methods=['GET'])
def foo():
   print request.args.get('summary')
   print request.args.get('change')
34

你可以试试这个:

Curl 请求

curl -i "localhost:5000/api/foo?a=hello&b=world"  

Flask 服务器

from flask import Flask, request

app = Flask(__name__)


@app.route('/api/foo/', methods=['GET'])
def foo():
    bar = request.args.to_dict()
    print bar
    return 'success', 200

if __name__ == '__main__':   
    app.run(debug=True)

控制台输出

{'a': u'hello', 'b': u'world'}

附注:在使用 curl 选项时,不要省略双引号(" "),否则在 Linux 系统上可能会出问题,因为 "&" 的原因。

109

其他回答提供的解决方案是正确的,如果你确实想使用查询参数的话。可以这样写:

@app.route('/createcm')
def createcm():
   summary  = request.args.get('summary', None)
   change  = request.args.get('change', None)

几点说明。如果你只需要支持GET请求,就不需要在你的路由装饰器中包含方法。

关于查询参数的解释。在你的例子中,"?"后面的所有内容都叫做查询参数。Flask会把这些查询参数从网址中提取出来,并放到一个叫ImmutableDict的地方。你可以通过request.args来访问这些参数,可以用键名,比如request.args['summary'],或者用我和其他一些评论者提到的get方法。这样做的好处是你可以设置一个默认值(比如None),如果这个参数不存在的话。查询参数通常是可选的,所以这种做法很常见。

现在还有另一种选择,你似乎在例子中想要尝试的,那就是使用路径参数。这看起来像这样:

@app.route('/createcm/<summary>/<change>')
def createcm(summary=None, change=None):
    ...

这里的网址是: http://0.0.0.0:8888/createcm/VVV/Feauure

其中VVV和Feauure会作为变量传递给你的函数。

撰写回答