我正在尝试将逗号分隔的查询参数传递给 Flask 端点。
一个示例 URI 是:
localhost:3031/someresource#?status=1001,1002,1003
查看request.argsorrequest.args.getlist('status')我看到我只得到一个字符串的返回。
ipdb> pp request.args
ImmutableMultiDict([('status', '1001,1002,1003')])
ipdb> request.args.getlist('status')
['1001,1002,1003']
Run Code Online (Sandbox Code Playgroud)
我知道我可以用逗号分割字符串,但这太hacky了。在 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
Run Code Online (Sandbox Code Playgroud)
def comma_separated_params_to_list(param):
result = []
for val in param.split(','):
if val:
result.append(val)
return result
Run Code Online (Sandbox Code Playgroud)
Sea*_*dge 15
使用逗号为同一个键传递多个值的 REST API 设计并不少见 - 使用户更容易。无论如何,您正在解析 GET args,解析字符串并没有那么难。如果带逗号的字符串格式不正确,您可以选择引发400 HTTP 错误。
其他一些语言(特别是 PHP)支持“数组”语法,因此有时会使用它:
/request?status[]=1000&status[]=1001&status[]=1002
该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)
Run Code Online (Sandbox Code Playgroud)
? curl "http://localhost:5000?status=5&status=7"
First Status: '5'
All Statuses: '['5', '7']'
Run Code Online (Sandbox Code Playgroud)
对此没有标准,如何解析/传递多个 GET 参数取决于您使用的语言/框架;flask 是建立在werkzeug之上的,所以它允许这种风格,但是如果你不使用flask,你就必须查找它。
这就是您可能想要的:
request.args.to_dict(flat=False)
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13560 次 |
| 最近记录: |