python - 如果使用多个路由,则 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"
. 这会导致name
是None
变量实际位于的位置request.args['name']
。
我不想做 a 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 配置变量更改,该变量回退到 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')
推荐阅读
- command-line - 从桌面快捷方式运行 Cmder 命令
- javascript - 如何在 Javascript 中以更优雅的方式制作此数组映射?
- php - 重定向到不在laravel中重定向的路由
- python-3.x - 使用 AWS Organizations API 绕过暂停的 AWS 账户
- datetime - 指定图片线人以读取特定的 datetme 字符串
- r - 我在 r 中的 for 循环代码中找不到错误
- c# - 我需要排除 USB 网络
- c# - C# - WPF 如何获取对象层级别
- javascript - css/JavaScript 调整 div 内容的大小以适应窗口
- python - 在已有数据的一侧创建一个滚动条