如果使用多个路由,则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']

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

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

flask.url_for(endpoint, **values)

您可以传递的值是:

  • 终结点– URL 的终结点(函数的名称(
  • – URL 规则的变量参数
  • _external– 如果设置为 True,则生成绝对 URL。服务器地址可以通过SERVER_NAME配置变量进行更改,该变量回退到主机标头,然后回退到请求的 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')

最新更新