Flask approute中的多个参数
如果我在网址调用中有多个参数,应该怎么写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会作为变量传递给你的函数。