带有 Flask request.args 的查询参数列表



我正在尝试将逗号分隔的查询参数传递给 Flask 端点。

示例 URI 为:

localhost:3031/someresource#?status=1001,1002,1003

查看request.argsrequest.args.getlist('status')的返回,我发现我只得到一个字符串。

ipdb> pp request.args
ImmutableMultiDict([('status', '1001,1002,1003')])
ipdb> request.args.getlist('status')
['1001,1002,1003']

我知道我可以用逗号拆分字符串,但这感觉很笨拙。在 Flask 中是否有更惯用的方法来处理这个问题?还是我的查询参数格式错误?

解决方案
由于 Flask 不直接支持逗号分隔的查询参数,因此我将其放入基本控制器中,以支持所有端点上的逗号分隔或重复查询参数。

request_data = {}
params = request.args.getlist('status') or request.form.getlist('status')
if len(params) == 1 and ',' in params[0]:
request_data['status'] = comma_separated_params_to_list(params[0])})
else:
request_data['status'] = params
def comma_separated_params_to_list(param):
result = []
for val in param.split(','):
if val:
result.append(val)
return result

flask变体getlist需要多个键:

from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def status():
first_status = request.args.get("status")
statuses = request.args.getlist("status")
return "First Status: '{}'nAll Statuses: '{}'".format(first_status, statuses)
❯ curl "http://localhost:5000?status=5&status=7"
First Status: '5'
All Statuses: '['5', '7']'

这没有标准,如何解析/传递多个GET参数取决于您使用的语言/框架;flask建立在werkzeug上,因此它允许这种风格,但是如果您从flask切换,则必须查找它。

顺便说一句,使用逗号为同一键传递多个值的 REST API 设计并不少见 - 使用户更容易。无论如何,您都在解析 GET 参数,解析生成的字符串并没有那么麻烦。如果带有逗号的字符串格式不正确,则可以选择引发 400 HTTP 错误。

其他一些语言(特别是PHP(支持"数组"语法,因此有时使用:

/request?status[]=1000&status[]=1001&status[]=1002

这是你可能想要的:

request.args.to_dict(flat=False)

默认情况下,flat为 True,因此通过将其设置为 False,您可以允许它在有多个字典时返回列表中包含值的字典。

根据to_dict文档:

to_dict(flat=True)
Return the contents as regular dict. If flat is True
the returned dict will only have the first item present, if flat is False
all values will be returned as lists.

最新更新