带有斜杠的 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 /foo
或GET /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的主要内容,如果未能解决你的问题,请参考以下文章