最近使用vue+django做一个项目
问题:
前端发get请求正常,发post请求的时候报错(403 Forbidden (CSRF token missing or incorrect.))
上度娘看了看,怎么都是注掉'django.middleware.csrf.CsrfViewMiddleware'
?
解决
找了一圈没有找到自己想要的答案,回过头看看错误信息,意思好像是我缺少csrf token
那这个csrf token在哪里?再上度娘看看,理解一下答案
- 如果仅是django项目,只需要在表单里加一个
{% csrf_token %}
(本文不涉及) - 前后分离,需要前端发请求的时候在请求头里添加
'X-CSRFToken'
按照描述的答案,'X-CSRFToken'
对应的csrftoken是需要在cookie里取的。由于这个cookie是服务器传过来的, 那么剩下的就简单了。
# 设置csrftoken的方式有好几种,我采用了装饰器的方法,方便简单。
from django.http import JsonResponse
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def demo_data_post(request):
return JsonResponse({"msg": "OK"})
前端调用这个view提供的接口,在cookie里就多了一个'csrftoken'
的值。然后拿着这个再做post请求,就不会出现上面的问题。
最后总结理解一下这个方法的实现过程:
- 前端发起请求(比如登录验证或者普通get请求),django通过
ensure_csrf_cookie
装饰器让客户端cookie存一个'csrftoken'
- 要求类似post请求(涉及到数据相关的请求),就需要前端发请求的时候,在请求头里加入
X-CSRFToken: csrftoken
网友评论