64

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

这是我从 AJax 调用的 URL:

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

我试图这样写我的烧瓶app.route

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

但这不起作用。谁能建议我如何提及app.route

4

8 回答 8

85

如果您确实想使用查询参数,其他答案有正确的解决方案。就像是:

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

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

解释查询参数。“?”之外的所有内容 在您的示例中称为查询参数。Flask 会将这些查询参数从 URL 中取出,并将它们放入 ImmutableDict。您可以通过 访问它request.args,或者使用密钥,即,request.args['summary']或者使用我和其他一些评论者提到的 get 方法。如果它不存在,这为您提供了为其提供默认值(例如无)的附加功能。这对于查询参数很常见,因为它们通常是可选的。

现在,您似乎在示例中尝试了另一个选项,那就是使用路径参数。这看起来像:

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

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

将 VVV 和 Feauure 作为变量传递给您的函数。

希望有帮助。

于 2016-12-28T21:21:22.240 回答
26

你可以试试这个:

卷曲请求

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'}

PS不要在curl选项中省略双引号(“”),否则它在Linux中不起作用因为“&”

于 2016-08-17T03:39:47.877 回答
24

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

from flask import request

@app.route('/createcm', methods=['GET'])
def foo():
   print request.args.get('summary')
   print request.args.get('change')
于 2013-03-03T05:20:22.117 回答
7
@app.route('/createcm', methods=['GET'])
def foo():
    print request.args.get('summary')
    print request.args.get('change')
于 2014-01-20T05:20:38.450 回答
4

您正在混淆 URL 参数和 URL 本身。

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

于 2013-03-03T05:19:47.387 回答
4

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

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)

httpie例子:

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"
}
于 2016-12-27T07:17:16.683 回答
3

简单地说,我们可以在两个步骤中做到这一点: 1] 烧瓶中的代码 [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
于 2018-12-05T06:38:44.193 回答
0

在flak我们这样做

@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
于 2021-06-23T02:14:57.083 回答