我有一个路由,它有两个可变部分,并使用defaults来指定每个部分的默认值.

@app.route("/api/<a>/<b>", defaults={"a": 0, "b": 0})
def api(a, b):
    return f"{a=}, {b=}"

我想建立一个URL,覆盖b,而保留默认值a/api/0/.

我试着排除aurl_for("api", b=1),但得到了werkzeug.routing.BuildError: Could not build url for endpoint 'api' with values ['b']. Did you forget to specify values ['a']?.似乎我不能排除一个变量,默认值在中没有被替换.

考虑到这一点,我试着用这两个变量调用,但得到了werkzeug.routing.BuildError: Could not build url for endpoint 'index.API.event_average_time_in_seconds' with values ['a', 'b']..似乎我也无法覆盖这两个变量.

如何在路由中使用默认值以允许不传递所有变量的值?

推荐答案

defaults的工作原理与您预期的不同.从werkzeug.routing.Rule的文档中:

`defaults`
    An optional dict with defaults for other rules with the same endpoint.
    This is a bit tricky but useful if you want to have unique URLs::

        url_map = Map([
            Rule('/all/', defaults={'page': 1}, endpoint='all_entries'),
            Rule('/all/page/<int:page>', endpoint='all_entries')
        ])

    If a user now visits ``http://example.com/all/page/1`` they will be
    redirected to ``http://example.com/all/``.  If `redirect_defaults` is
    disabled on the `Map` instance this will only affect the URL
    generation.

您可以使用默认值创建一个没有相应变量的默认URL,并使用这些默认值将其路由到正确的端点.它将为单个规则填充或覆盖not个值.它既需要一个带有默认值(且无变量)的规则,也需要一个带有变量的规则.

下面是如何使用四条规则来允许您想要的行为,覆盖变量的任何组合.不过,通常情况下,您不会在URL中写入默认值,而是按照上面文档中的示例进行操作,并拥有一个默认规则,URL中没有值.

@app.route("/api/0/0", defaults={"a": 0, "b": 0})
@app.route("/api/<a>/0", defaults={"b": 0})
@app.route("/api/0/<b>", defaults={"a": 0})
@app.route("/api/<a>/<b>")
def api_items(a, b):
    return f"{a=}, {b=}"
url_for("api_items")
/api/0/0

url_for("api_items", a=1)
/api/1/0

url_for("api_items", b=1)
/api/0/1

url_for("api_items", a=1, b=1)
/api/1/1

Python相关问答推荐

我们可以在apps.py?中使用Post_Save信号吗

重命名变量并使用载体中的字符串存储 Select 该变量

使用Python从HTTP打印值

当变量也可以是无或真时,判断是否为假

如何处理必须存在于环境中但无法安装的Python项目依赖项?

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

为什么dict(id=1,**{id:2})有时会引发KeyMessage:id而不是TypMessage?

遵循轮廓中对象方向的计算线

从管道将Python应用程序部署到Azure Web应用程序,不包括需求包

无法使用equals_html从网址获取全文

使用LineConnection动画1D数据

numba jitClass,记录类型为字符串

将两只Pandas rame乘以指数

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

启用/禁用shiny 的自动重新加载

Python列表不会在条件while循环中正确随机化'

try 检索blob名称列表时出现错误填充错误""

使用Python从rotowire中抓取MLB每日阵容

在Python中计算连续天数