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

4

我的表单通过 GET 发送年龄参数,只需使用以下代码即可正常工作:

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

我没有去理会

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

有所谓的重要性吗?


如果您想要指定访问路由的特定方法,这是很重要的。 - roganjosh
3个回答

5

从技术上讲,这并不重要,因为它能够工作。然而通常情况下,您希望有几个执行不同任务的函数,例如:POST到/foo表示添加元素,GET到/foo表示检索元素(们),DELETE到/foo表示删除元素。


这是一个常见的约定吗?POST用于插入操作,GET用于选择操作? - JackOfAll
根据HTTP方法的标准,我们使用POST来插入新对象,使用GET来选择一个对象,使用PUT来替换整个现有对象,使用DELETE来删除它,使用PATCH来部分更新它。https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html。我相信PATCH作为REST的一部分被引入,作为仅更新编辑属性而不是整个对象的方法。 - Atle Kristiansen

4
如果您没有为app.route()指定methods参数,那么默认只接受GETHEAD请求(*)
只有当您需要接受其他HTTP方法(如POST)时,才需要明确设置methods,否则Flask会响应405 Method Not Allowed HTTP response code,并且您的路由函数将不会被调用。
因此,如果您的路由应该处理GETPOST请求,但是您忘记在@route()中添加methods=['GET', 'POST'],那么您就会遇到错误,因为POST请求会导致405响应,而不是您的路由处理请求。
在您的情况下,不过您应该使用 methods=['GET', 'POST'] 而是让试图使用 POST 的客户端知道您的路由不处理那种方法。更好的做法是显式地报错,而不是让它悄悄地通过。
每当您注册一个处理GET的路由时,就会添加HEAD。在HEAD请求的情况下,将调用您的路由,并仅向客户端提供标头。Flask会自动为您处理OPTIONS,在这种情况下不会调用路由。

0

一如既往,答案是:这取决于情况。

如果你没有提供"methods"参数,那么Flask会假设HTTP方法是GET(也接受HEAD)。只要这个假设是正确的,你的代码就可以正常工作。

然而,如果你的网页以POST方法(或DELETE等)通信,Flask将失败并抱怨不允许POST(或DELETE等)请求。

想象一下这个要求就像冗余检查一样。Flask本来可以被编写成适应HTTP请求中使用的任何方法。相反,Flask坚持要求您指定方法,以此作为一种沟通形式的信号。这个要求使得Flask实现变得更加简单,但代价是让程序员承担协调客户端-服务器接口的责任。


POST用于DELETE操作,GET用于其他操作是一种常见的约定吗?在上面的另一个回答中,他暗示POST用于INSERT操作,而GET用于SELECT操作? - JackOfAll
有一些HTTP纯粹主义者非常谨慎地指定HEAD、GET、POST、DELETE、UPDATE等方法。Flask可以容纳所有这些选项。如果您将UPDATE指定为HTTP方法,则需要在Flask方法列表中包含“UPDATE”。然而,您是正确的,通常只需使用POST来处理所有“更改”操作。 - joepython

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接