我在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"
。这会导致name
被None
,其中变量实际上位于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')