带有尾随斜杠的Flask POST

时间:2017-03-08 01:15:55

标签: python python-2.7 flask

文档说明定义路由的首选方法是包含一个尾部斜杠:

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

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

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

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,如果您处于调试模式,它将失败并显示以下通知:

  

我们已将请求发送到此网址(http://localhost:5000/foo),但路由系统会自动向#34; 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同时处理非尾随斜杠和尾随斜杠?

2 个答案:

答案 0 :(得分:6)

请参阅这篇文章: 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

答案 1 :(得分:0)

您可以检查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