当前端点的 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 (&lt;var&gt;),只能通过 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&amp;var2=xyz(这让我觉得奇怪)。

通过试验和错误,我发现将 POST 添加到 /hi/&lt;var&gt; 允许的方法可以解决问题(/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/&lt;var&gt; 上进行 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/&lt;var&gt;/hi/)上允许 POST 可以解决问题的原因——如果 POST 只允许用于 /hi/,那么return str(url_for('hi', var='Hello', var2='xyz', _method='POST') 将检查 var 是否只有 /hi/ 知道(以及显然,它不知道它)。另一方面,如果在两个端点上都允许 POST,则检查 /hi//hi/&lt;var&gt; 是否存在 var 并正确选择 /hi/&lt;var&gt;

    鉴于前面的观点,现在的修复非常明显: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 标头中?

为啥这个 SPARQL 查询超时以及如何优化这个查询?

如何以编程方式发现我的 c# 应用程序的当前端点?

如何找到有关 Apple 验证的 REST 文档以及为啥 /verifyReceipt 不起作用?

在 vue js 中的何处以及如何存储 API 端点?