Flask 中的多个参数

如果在 URL 调用中有多个参数,如何编写烧瓶 app.route

这是我从 AJax 打来的网址:

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

我试着把我的烧瓶 app.route写成这样:

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

但是这没有用。有人能给我建议如何提到 app.route吗?

114093 次浏览

你把 URL 参数和 URL 本身搞混了。

您可以使用 request.args.get("summary")request.args.get("change")访问 URL 参数。

路由与直接传递给方法的查询字符串不匹配。

from flask import request


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

你可以试试这个:

卷发请求

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

烧瓶服务器

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 中不起作用,因为“ &”

在您的请求 url: http://0.0.0.0:8888/createcm?summary=VVV&change=Feauure中,端点是 /createcm,而 ?summary=VVV&change=Feauure是请求的 args部分。所以你可以试试这个:

from flask import Flask, request, jsonify


app = Flask(__name__)


@app.route('/createcm', methods=['get'])
def create_cm():
summary = request.args.get('summary', None) # use default value repalce 'None'
change = request.args.get('change', None)
# do something, eg. return json response
return jsonify({'summary': summary, 'change': change})




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

例子:

http get :5000/createcm summary==vvv change==bbb -v
GET /createcm?summary=vvv&change=bbb HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:5000
User-Agent: HTTPie/0.9.8






HTTP/1.0 200 OK
Content-Length: 43
Content-Type: application/json
Date: Wed, 28 Dec 2016 01:11:23 GMT
Server: Werkzeug/0.11.13 Python/3.6.0


{
"change": "bbb",
"summary": "vvv"
}

如果你确实想使用查询参数,其他的答案都有正确的解决方案,比如:

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

一些笔记。如果只需要支持 GET 请求,则不需要在路由装饰器中包含这些方法。

解释查询参数。除了“ ?”在您的示例中称为查询参数。Flask 将从 URL 中取出这些查询参数,并将它们放到 ImmutableDect 中。您可以通过 request.args访问它,或者使用键,即 request.args['summary'],或者使用我和其他一些评论者提到的 get 方法。这使您能够在缺省值不存在的情况下给它一个缺省值(比如 Nothing)。这在查询参数中很常见,因为它们通常是可选的。

现在还有另外一个选项,您似乎正在尝试在您的示例中这样做,那就是使用 Path Param。这看起来像:

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

这里的网址是: Http://0.0.0.0:8888/createcm/vvv/feauure

将 VVV 和 Feature 作为变量传递到函数中。

希望能帮上忙。

简单来说,我们可以分为两个步骤: 烧瓶中的代码[ app.py ]

from flask import Flask,request


app = Flask(__name__)


@app.route('/')
def index():
return "hello"


@app.route('/admin',methods=['POST','GET'])
def checkDate():
return 'From Date is'+request.args.get('from_date')+ ' To Date is '+ request.args.get('to_date')




if __name__=="__main__":
app.run(port=5000,debug=True)

2]在浏览器中点击网址:

http://127.0.0.1:5000/admin?from_date=%222018-01-01%22&to_date=%222018-12-01%22

我们用这种方式进行攻击

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

现在您可以使用不同的可选参数运行端点,如下所示

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