Django REST框架 - POST请求返回“不允许使用GET方法”。

11
我按照安装教程设置了django-rest-auth,但我无法使用登录API端点。当我发送一个带有正确信息的POST请求时,我会收到一个405状态错误响应,显示“不允许使用方法“GET””。
然而,当我导航到实际的URL并从在线表单中进行POST时,它可以正常工作并返回一个令牌。
求助!
使用Postman的示例:

https://i.imgur.com/574rERm.png

Axios示例:

axios.post('http://----.com/api/accounts/login/', data: {'username': ---, 'password': ---})
.then(function (response) {console.log(response);})
.catch(function (response) {console.log(response);})

更新:

这似乎是Heroku或Gunicorn的问题?该网站使用Gunicorn在Heroku上部署,但所有POST请求都被接收为GET请求。


你是如何发送失败的请求的? - Burhan Khalid
@Burhan Khalid 我已经使用Postman和Axios(来自React Native)发送了请求。两者都返回状态码405。 - Priyam Mohanty
问题在于你是如何使用Postman / Axios发送请求,而不是使用DRF,因为显然如果你使用浏览器,它是可以工作的(正如你自己所说)。因此,除非你编辑问题并添加代码示例,否则不确定如何在这里帮助你。 - Burhan Khalid
嗨Burhan,我已经添加了我的Axios请求代码。谢谢。 - Priyam Mohanty
3个回答

26

对于任何遇到POST请求神奇地变成GET请求的人...

我正在使用Heroku上的Django + DRF。问题非常简单,让我想同时大笑和哭泣。

Heroku将对http://example.com的请求重定向到http://www.example.com,这个重定向涉及到一个GET请求。因此,POST请求被接收为GET请求,而没有最初存在的任何头部或主体。

所有这些工作和沮丧都只是因为缺少“www”。希望这能在将来帮助到某人!

https://dev59.com/PX_aa4cB1Zd3GeqP7L1I#23688973


1
这对我很有帮助! - Daniel Reinoso
1
一个神一般的存在。谢谢! - Brand0R
4
我遗漏了一个末尾斜杠。 - Ariel
2
如果您在Postman上遇到此问题,请不要忘记在URL末尾添加/ :| - Amr
1
@Ariel 非常感谢!我在通过 Node 后端服务器(node-fetch)调用 Django API 时也忘了加上尾随斜杠。 - Hassan Mehdi
显示剩余3条评论

1
如果在构建请求时URL末尾没有提供斜杠/,您可能也会看到此错误。例如,对于以下请求,Django将返回405错误:
import requests

response = requests.post(
    url='https://myapi.com/api/endpoint',
    headers={'Authorization': f'Token {authentication_token}'},
    data=data,
)

0
在我的情况下,我忽略了 https:// 前缀,所以 Nginx 将 backend.foo.com 重定向到 https://backend.foo.com,并且在此过程中,POST 方法被更改为 GET,因此我只需添加 https:// 前缀即可解决问题。

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