我需要在@ app.route()中使用method = ['GET','POST']吗?

时间:2019-03-09 17:15:05

标签: python flask

“我的表单”通过GET发送age参数,并且它仅与此配合使用:

@app.route("/foo")
def foo():
  age = request.args['age']

我没有打扰

@app.route('/foo', methods=['GET', 'POST'])

有关系吗?

3 个答案:

答案 0 :(得分:3)

从一定意义上说,这没关系。但是通常情况下,您希望具有多个功能来完成类似的事情。 POST到/ foo,表示添加一个元素,GET到/ foo,表示检索元素,DELETE到/ foo,表示删除元素。

答案 1 :(得分:0)

如果您没有为methods指定app.route()参数,则默认值为仅接受GETHEAD请求(*)

仅在需要接受其他HTTP方法(例如methods)时才需要显式设置POST,否则Flask在以下情况下会以405 Method Not Allowed HTTP response code进行响应客户端使用您未列出的HTTP方法,并且不会调用您的route函数。

因此,如果您的路线同时处理GETPOST的请求,但是您忘记将methods=['GET', 'POST']添加到@route(),则您有POST请求中的错误导致405响应,而不是您的路由来处理该请求。

但是,在您的情况下,您应该使用methods=['GET', 'POST'],而是让尝试使用POST的客户端知道您的路由无法处理该方法。明确指出错误总比让它静默通过更好。


(*)每当您使用注册处理HEAD的路由时都会添加GET,并且在有HEAD请求的情况下,您的路由被称为然后仅将标头提供给客户端。 Flask会自动为您处理OPTIONS,在这种情况下不会调用该路由。

答案 2 :(得分:0)

一如既往,答案是:它取决于。

如果不提供“方法”参数,则Flask假定HTTP方法为GET(并且也接受HEAD)。只要该假设成立,您的代码就可以正常工作。

但是,如果您的网页是以POST方法(或DELETE等)进行通信的,则Flask将失败并抱怨不允许POST(或DELETE等)请求。

将此要求视为冗余检查。可以编写Flask来适应HTTP请求中使用的任何方法。相反,Flask坚持要求您将方法指定为有意进行通信的信号。这项要求使Flask的实现变得简单一些,但要付出协调程序员与客户-服务器接口的责任。