首页 > 解决方案 > 如果使用多个路由,则 url_for 将变量映射到 URL 会出现问题

问题描述

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

我的用例是一个 API,其中创建对象将返回与在其上运行 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')将正确返回"test/xyz"

但是,对于这两app.route行,它会返回"test?name=xyz". 这会导致nameNone变量实际位于的位置request.args['name']

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

标签: pythonflaskurl-for

解决方案


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

flask.url_for(endpoint, **values)

您可以传递的值是:

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

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

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

推荐阅读