Flask POSTs with Trailing Slash

该文档指出,定义路线的首选方式是包含尾部斜线:

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

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

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

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使用该method not allowed如果您处于调试模式,它将失败,并显示以下提示:

一个请求被发送到这个URL(http:// localhost:5000 / foo),但是一个重定向被路由系统自动发送到“http:// localhost:5000 / foo /”,URL被定义为一个尾随所以Flask会自动重定向到带有斜杠的URL,如果它没有被访问,请确保直接发送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():
    return redirect(url_for('post_foo'), code=302)

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

有没有办法让POST在非尾随和尾随斜杠上工作?


请参阅此帖子: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


您可以检查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
链接地址: http://www.djcxy.com/p/48565.html

上一篇: Flask POSTs with Trailing Slash

下一篇: Error processing Json request