Flask request.args查询参数列表

发布于 2021-01-29 15:05:53

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

URI的示例为:

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

查看的返回,request.args否则request.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
关注者
0
被浏览
92
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    REST API设计很常见,它使用逗号来为同一密钥传递多个值-使用户更容易。无论如何,您都在解析GET
    args,解析字符串并没有那么hacky。如果它们的逗号格式字符串格式不正确,则可以选择引发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)
    
    
    
    ❯ curl "http://localhost:5000?status=5&status=7"
    First Status: '5'
    All Statuses: '['5', '7']'
    

    对此没有标准,如何解析/传递多个GET参数取决于您使用的语言/框架。flask是在werkzeug上构建的,因此允许这种样式,但是如果您转离烧瓶,则必须查找它。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看