首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Flask的url_for在URL中生成列表

使用Flask的url_for在URL中生成列表
EN

Stack Overflow用户
提问于 2018-01-17 03:15:08
回答 1查看 1.6K关注 0票数 1

我使用webargs解析来自request.args的参数,并将它们作为参数传递给Flask视图。我的客户使用逗号分隔的列表来表示一个键的多个值:

代码语言:javascript
复制
/queues/generate?queue_id=4&include_ids=1,2,3

为了解析它,我使用了棉花糖的DelimitedList字段。

代码语言:javascript
复制
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,它会为每个值生成重复的键:

代码语言:javascript
复制
url_for('queues.generate', queue_id=4, include_ids=[1, 2, 3])
代码语言:javascript
复制
/queues/generate?queue_id=4&include_ids=1&include_ids=2&include_ids=3

使用DelimitedList字段解析它只捕获第一个值。更改为List字段会正确地再次捕获这些值。所以要么我的Flask URL失败,要么我的客户端URL失败。

我不能改变我的客户端生成DelimitedField的方式,所以我想坚持使用URL进行解析。如何让url_for生成相同的样式?

EN

回答 1

Stack Overflow用户

发布于 2018-01-17 05:55:09

There's no standard for specifying multiple values for a key in a query string. Flask、浏览器和许多其他web技术都使用您在url_forrequest.args中看到的“重复键”样式。您的客户已选择使用不同的样式。

如果希望url_for生成分隔样式,则需要对传递给url_for的值进行预处理。围绕url_for编写一个包装器,并使用它。

代码语言:javascript
复制
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或其他方式解析任何传入的逗号分隔值。相反,从客户端生成重复键样式可能会更容易。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48288322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档