带尾斜杠的烧瓶POST

Mat*_*sen 6 python flask python-2.7

该文档指出,定义路线的首选方式是在结尾加上斜杠:

@app.route('/foo/', methods=['GET'])
def get_foo():
    pass
Run Code Online (Sandbox Code Playgroud)

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

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

从烧瓶进口烧瓶
app = Flask(__ name__)

@ app.route( '/富/',方法= [ 'POST'])
def post_foo():
    返回“栏”

app.run(端口= 5000)

在这里,如果你POST /foo,它会失败,method not allowed如果你没有在调试模式下运行,或者如果你是在调试模式下,它会用以下通知失败:

一个请求被发送到这个URL(HTTP://本地主机:5000 / FOO),但重定向由路由系统自动发出“ HTTP://本地主机:5000 /富/&QUOT ;该URL与一个尾随限定。斜线所以瓶将自动重定向到与如果它没有一个访问的结尾的斜线的网址。请务必使直接发送您的POST请求到这个网址,因为我们不能让浏览器或HTTP客户端表单数据可靠或不带用户重定向相互作用


此外,您似乎甚至无法执行此操作:

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

或这个:

@ app.route( '/富',方法= [ 'POST'])
DEF post_foo_no_slash():
    返回重定向(url_for( 'post_foo'),代码= 302)

@ app.route( '/富/',方法= [ 'POST'])
def post_foo():
    返回“栏”

有没有什么办法让POST工作在两个非拖尾和结尾的斜杠?

Woj*_*bas 8

请参阅此帖子: Flask path规则中的尾部斜杠触发器404

您可以禁用严格的斜杠来满足您的需求

全球范围内:

app = Flask(__name__)
app.url_map.strict_slashes = False
Run Code Online (Sandbox Code Playgroud)

...或按路线

@app.route('/foo', methods=['POST'], strict_slashes=False)
def foo():
    return 'foo'
Run Code Online (Sandbox Code Playgroud)

您也可以检查此链接。github上对此有单独的讨论。https://github.com/pallets/flask/issues/1783