文档指出,定义路由的首选方式是包含一个尾随斜杠:
@app.route('/foo/', methods=['GET'])
def get_foo():
pass
这样,客户端就可以get/foo
或get/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
同时处理非尾随斜杠和尾随斜杠?
请参考这篇文章:尾随斜杠触发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