当前端点的 http 方法为啥以及如何影响 Flask 中的 url_for 行为?
Posted
技术标签:
【中文标题】当前端点的 http 方法为啥以及如何影响 Flask 中的 url_for 行为?【英文标题】:Why and how http method of current endpoint affects url_for behavior in Flask?当前端点的 http 方法为什么以及如何影响 Flask 中的 url_for 行为? 【发布时间】:2019-01-21 08:20:48 【问题描述】:我正在使用:
Flask0.12.2 Python3.6.1考虑一下我正在思考的这个孤立的行为示例:
from flask import Flask, url_for, render_template_string
app = Flask(__name__)
@app.route('/hi/', methods=['POST'])
@app.route('/hi/<var>')
def hi(var):
return ''
@app.route('/')
def index():
return render_template_string('''
<html>
<head>
<title>GET or POST</title>
</head>
<body>
<form action=" url_for('path') ">
<input type='SUBMIT' value='GET'>
</form>
<form action=" url_for('path') " method='POST'>
<input type='SUBMIT' value='POST'>
</form>
</body>
</html>''')
@app.route('/path/', methods=['GET', 'POST'])
def path():
return str(url_for('hi', var='Hello', var2='xyz'))
为了说明我的意图,我将简要描述正在发生的事情以及我正在努力理解的内容:
/hi/
端点有一个 'optional' parameter (<var>
),只能通过 GET 请求接受。 'Plain'(即不带参数)/hi/
端点只能通过 POST 方法访问。
/path/
端点可以通过 GET 和 POST http 方法访问。它只返回通过url_for('hi', var='Hello', var2='xyz')
生成的hi
的路径
现在,我希望/path/
返回相同的字符串,无论使用哪种方法访问它(GET 或POST)。但事实并非如此:对于 GET,它返回 /hi/Hello?var2=xyz
(实际上,正如我所期望的那样),但对于 POST,我得到 /hi/?var=Hello&var2=xyz
(这让我觉得奇怪)。
通过试验和错误,我发现将 POST 添加到 /hi/<var>
允许的方法可以解决问题(/hi/Hello?var2=xyz
由 GET 和 POST 的 /path/
返回),即:
@app.route('/hi/', methods=['POST'])
@app.route('/hi/<var>', methods=['GET', 'POST'])
def hi(var):
...
我希望有人能够为我解释以下内容:
-
为什么会发生这种情况(
/path/
为 POST 和 GET 返回不同的值)?
是否可以避免这种行为,而不允许在 /hi/<var>
上进行 POST?
【问题讨论】:
【参考方案1】:感谢another question =),我偶然发现了答案
解决我自己的问题:
(对此不是 100% 确定,如果有人确认我在这里是正确的,将不胜感激)url_for
有一个可选的 _method
参数,默认为方法用于返回当前视图。因此,/path/
在通过 GET 请求访问时返回 return str(url_for('hi', var='Hello', var2='xyz', _method='GET')
,如果通过 POST 请求访问,则返回 return str(url_for('hi', var='Hello', var2='xyz', _method='POST')
。这就是为什么在两个端点(/hi/<var>
和 /hi/
)上允许 POST 可以解决问题的原因——如果 POST 只允许用于 /hi/
,那么return str(url_for('hi', var='Hello', var2='xyz', _method='POST')
将检查 var
是否只有 /hi/
知道(以及显然,它不知道它)。另一方面,如果在两个端点上都允许 POST,则检查 /hi/
和 /hi/<var>
是否存在 var
并正确选择 /hi/<var>
。
鉴于前面的观点,现在的修复非常明显:return str(url_for('hi', var='Hello', var2='xyz', _method='GET')
应替换为原始 sn-p 中的 return str(url_for('hi', var='Hello', var2='xyz')
。
【讨论】:
以上是关于当前端点的 http 方法为啥以及如何影响 Flask 中的 url_for 行为?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SOAP 参数的顺序在 PHP SOAP 中很重要,以及如何解决它?
在哪里存储身份验证令牌(前端)以及如何将其放入多个端点的 http 标头中?