【问题标题】:List of query params with Flask request.args带有 Flask request.args 的查询参数列表
【发布时间】:2019-09-12 20:57:33
【问题描述】:

我正在尝试将逗号分隔的查询参数传递给 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

【问题讨论】:

  • AFAIK 查询参数只是键/值对。我会把它分开。另一种选择是将请求正文作为 json 发送并在后端解析

标签: python flask


【解决方案1】:

使用逗号为同一个键传递多个值的 REST API 设计并不少见 - 让用户更轻松。无论如何,您正在解析 GET args,解析字符串并没有那么复杂。如果带有逗号的字符串格式不正确,您可以选择引发400 HTTP 错误。

其他一些语言(尤其是 PHP)支持 'array' 语法,所以有时会用到:

/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)
❯ curl "http://localhost:5000?status=5&status=7"
First Status: '5'
All Statuses: '['5', '7']'

对此没有标准,如何解析/传递多个 GET 参数取决于您使用的语言/框架; flask 是基于werkzeug 构建的,所以它允许这种风格,但是如果你从 flask 中切换出来,你就必须查找它。

【讨论】:

    【解决方案2】:

    这就是你可能想要的:

    request.arg.to_dict(flat=False)
    

    flat 默认情况下为 True,因此通过将其设置为 False,您允许它返回一个包含多个值的 dict。

    根据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.
    

    【讨论】:

      猜你喜欢
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多