带有斜杠的 Flask POST

Posted

技术标签:

【中文标题】带有斜杠的 Flask POST【英文标题】:Flask POSTs with Trailing Slash 【发布时间】:2017-07-28 10:15:21 【问题描述】:

文档指出,定义路由的首选方法是包含尾部斜杠:

@app.route('/foo/', methods=['GET'])
def get_foo():
    pass

这样,客户端可以GET /fooGET /foo/ 并收到相同的结果。

但是,POST 方法的行为不同。

从烧瓶进口烧瓶 app = Flask(__name__) @app.route('/foo/', methods=['POST']) def post_foo(): 返回“酒吧” 应用程序运行(端口=5000)

这里,如果您POST /foo,如果您未在调试模式下运行,它将失败并显示method not allowed,或者如果您处于调试模式,它将失败并显示以下通知:

向这个 URL (http://localhost:5000/foo) 发送了一个请求,但是路由系统自动发出了一个重定向到“http://localhost:5000/foo/"。这个 URL 是用尾部斜杠定义的,所以 Flask 会自动重定向到带有如果没有斜杠就访问它。请确保将您的 POST 请求直接发送到此 URL,因为我们无法使浏览器或 HTTP 客户端使用表单数据可靠地重定向或无需用户交互


此外,您似乎甚至不能这样做:

@app.route('/foo', methods=['POST'])
@app.route('/foo/', methods=['POST'])
def post_foo():
    return "bar"

或者这个:

@app.route('/foo', methods=['POST']) def post_foo_no_slash(): 返回重定向(url_for('post_foo'),代码=302) @app.route('/foo/', methods=['POST']) def post_foo(): 返回“酒吧”

有什么方法可以让POST 同时处理非尾随斜杠和尾随斜杠?

【问题讨论】:

【参考方案1】:

您可以检查request.path 是否/foo/ 然后将其重定向到您想要的位置:

@app.before_request
def before_request():
    if request.path == '/foo':
        return redirect(url_for('foo'), code=123)

@app.route('/foo/', methods=['POST'])
def foo():
    return 'foo'

$ http post localhost:5000/foo 
127.0.0.1 - - [08/Mar/2017 13:06:48] "POST /foo HTTP/1.1" 123

【讨论】:

【参考方案2】:

请参考这篇文章: Trailing slash triggers 404 in Flask path rule

您可以禁用严格的斜线来满足您的需求

全球:

app = Flask(__name__)
app.url_map.strict_slashes = False

...或每条路线

@app.route('/foo', methods=['POST'], strict_slashes=False)
def foo():
    return 'foo'

您也可以查看此链接。 github上有关于这个的单独讨论。 https://github.com/pallets/flask/issues/1783

【讨论】:

很好的答案,而且内容丰富。谢谢@Wojciech Jakubas

以上是关于带有斜杠的 Flask POST的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 斜杠连接到 GET 而不是 POST

带有或不带有斜杠的 PHP RegEx

如何将带有斜杠的 URL 重定向到没有斜杠的相应 URL?

如何将带有双反斜杠的字符串转换为单反斜杠

php post get 繁体日文韩文时 自动添加 反斜杠 问题

带有斜杠的奇怪 Nginx 行为