我使用webargs解析来自request.args的参数,并将它们作为参数传递给Flask视图。我的客户使用逗号分隔的列表来表示一个键的多个值:
/queues/generate?queue_id=4&include_ids=1,2,3为了解析它,我使用了棉花糖的DelimitedList字段。
from marshmallow import Schema, fields
from webargs import use_args
from webargs.fields import DelimitedList
class GenerationParamsSchema(Schema):
queue_id = fields.Integer(required=True)
include_ids = DelimitedList(fields.Integer(), required=False)
@queues.route('/generate_content', methods=['GET'])
@use_args(GenerationParamsSchema(strict=True))
def generate_content_count(generation_params):
...但是,如果我使用Flask的url_for生成URL,它会为每个值生成重复的键:
url_for('queues.generate', queue_id=4, include_ids=[1, 2, 3])/queues/generate?queue_id=4&include_ids=1&include_ids=2&include_ids=3使用DelimitedList字段解析它只捕获第一个值。更改为List字段会正确地再次捕获这些值。所以要么我的Flask URL失败,要么我的客户端URL失败。
我不能改变我的客户端生成DelimitedField的方式,所以我想坚持使用URL进行解析。如何让url_for生成相同的样式?
发布于 2018-01-17 05:55:09
There's no standard for specifying multiple values for a key in a query string. Flask、浏览器和许多其他web技术都使用您在url_for和request.args中看到的“重复键”样式。您的客户已选择使用不同的样式。
如果希望url_for生成分隔样式,则需要对传递给url_for的值进行预处理。围绕url_for编写一个包装器,并使用它。
from flask import url_for as _url_for
@app.template_global()
def url_for(endpoint, **values):
for key, value in values.items():
if isinstance(value, (tuple, list)):
values[key] = ','.join(value)
return _url_for(endpoint, **values)请记住,requests.args只理解repeat键样式,因此您必须使用webargs或其他方式解析任何传入的逗号分隔值。相反,从客户端生成重复键样式可能会更容易。
https://stackoverflow.com/questions/48288322
复制相似问题