提问者:小点点

带后斜线的烧瓶柱


文档指出,定义路由的首选方式是包含一个尾随斜杠:

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

这样,客户端就可以get/fooget/foo/并接收相同的结果。

但是,发布的方法没有相同的行为。

from flask import Flask
app = Flask(__name__)

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

app.run(port=5000)

在这里,如果您post/foo,那么如果您不是在调试模式下运行,它将以method not allowed失败,或者如果您是在调试模式下运行,它将以以下通知失败:

请求已发送到此URL(HTTP://localhost:5000/foo),但路由系统自动发出重定向到“HTTP://localhost:5000/foo/”。URL是用后斜杠定义的,因此如果没有后斜杠访问Flask时,它将自动重定向到带有后斜杠的URL。请确保将您的后请求直接发送到此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():
    return redirect(url_for('post_foo'), code=302)

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

有没有办法让post同时处理非尾随斜杠和尾随斜杠?


共1个答案

匿名用户

请参考这篇文章:尾随斜杠触发Flask路径规则中的404

您可以禁用严格斜杠以支持您的需要

全球范围:

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