如果使用多个路由,url_for 将变量映射到 URL 的问题

Issue with url_for mapping variables to URL if multiple routes are used

我遇到了 url_for 的问题,它不会自动将变量直接重新映射到 URL,因为有两条路线。

我的用例是一个 API,其中创建一个对象将 return 与 GET 命令 运行 相同的数据。

下面是代码示例:

@app.route('/test', methods=['POST'])
@app.route('/test/<string:name>', methods=['GET'])
def test(name=None):
    if request.method == 'POST':
        return redirect(url_for('test', name='xyz'))
    return name

如果第一个 app.route 被删除,那么 url_for('test', name='xyz') 将正确 return "test/xyz".

但是,对于 app.route 两行,它 returns "test?name=xyz"。这会导致 name 变为 None,其中变量实际位于 request.args['name'].

我不想做 if name is None: name=request.args.get('name'),那么有什么方法可以强制它只查看使用 GET 方法的路由吗?我现在的情况很简单,我可以做到 url_for('test')+'/xyz',但似乎应该有更好的方法来做到这一点。

根据 Flask Docs,您可以使用 _method 参数指定要映射的方法。

flask.url_for(endpoint, **values)

您可以传递的值是:

  • endpoint – URL(函数名称)
  • 的端点
  • values – URL 规则的可变参数
  • _external – 如果设置为 True,将生成绝对 URL。服务器地址可以通过 SERVER_NAME 配置变量更改,该变量回退到主机 header,然后是请求的 IP 和端口。
  • _scheme – 指定所需 URL 方案的字符串。 _external 参数必须设置为 True 或引发 ValueError。默认行为使用与当前请求相同的方案,如果没有可用的请求上下文,则使用应用程序配置中的 PREFERRED_URL_SCHEME。从 Werkzeug 0.10 开始,这也可以设置为空字符串以构建 protocol-relative URLs.
  • _anchor – 如果提供,则将其作为锚点添加到 URL.
  • _method – 如果提供,则明确指定 HTTP 方法。 <---- 这个

在 url_for 中指定 _method 参数,如下所示:

url_for('test', name='xyz', _method='GET')