CSRF验证失败。请求已中止。当我发送POST请求时。

8
我正在从安卓应用向服务器发送一个POST请求,但是我收到了以下错误信息:

enter image description here

POST请求如下所示: http://example/my_page_url/1000 其中的1000是一个ID。
这是我的视图方法:
def inventory(request, cross_id):

    text_file = open("test.txt", "w")
    text_file.write('POST Received')

    text_file.write(cross_id.__str__())
    text_file.close()

    return render(request, 'Inventory.html', {})

我的模板代码:

<form action='' method="POST">

     <button type="submit" id="btn_save" name="btn_save">Save</button>

    {% csrf_token %}

</form>

实际上,我并不需要调用模板,因为我只想在服务器上执行某些操作。但是现在我正在调用模板,只是为了防止出现任何错误。
我已经阅读了其他相同问题的答案,但它们都忽略了模板中的CSRF令牌或视图方法中的其他内容,但我认为这里的情况不同。

你是要提交那个表单还是其他什么东西? - Sayse
1
不,这个POST请求来自一个安卓APP。为了测试,我现在正在使用Postman应用程序进行POST请求以获取错误消息。 - The Maestro
那么是的,你需要在你的POST请求中包含一个有效的CSRF令牌。 - Sayse
您的中间件设置中是否包含了django.middleware.csrf.CsrfViewMiddleware - vmonteco
是的,当然存在 :D - The Maestro
显示剩余2条评论
1个回答

13

您需要为所有POST请求添加X-CSRFToken头。

您可以从名为csrftoken的cookie中获取此标头的适当值。

要在Postman中进行测试,您需要启用拦截器插件(右上角)。

安装完成后,向/admin/login/发出GET请求(确保您已从浏览器中注销)。在Cookie部分中,您应该看到一个名为csrftoken的cookie,请复制其值。

现在,将请求类型设置为同一URL(/admin/login)的POST,添加一个名为X-CSRFToken的标头,并使用先前复制的值。 在Body部分设置usernamepassword字段,然后点击发送。

X-CSRFToken

如果您的POST不需要身份验证,则可以使用先前GET请求的csrftoken


嗨@Kedar,当我向/admin/login发出GET请求时,我需要提供usernamepassword登录到页面中吗?还是只需访问页面而无需登录即可获取csrftoken值? - aspiring1
@aspiring1 只需访问页面(无需登录详细信息)即可。 - Kedar
如果我的应用程序只启用了 POST 请求,我该怎么办?在这种情况下,我如何获取 csrf 令牌? - aspiring1
在这种情况下,您可以删除CSRF检查。https://dev59.com/m2Qn5IYBdhLWcg3w7ayK#16458216 - Kedar

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