项目是Django4+Vue2,遇到Forbidden (CSRF cookie not set.): /login/,目前已经采取的网上的注释掉'django.middleware.csrf.CsrfViewMiddleware'和使用 @csrf_exempt 来进行处理,但是都没有解决该问题,求帮助。
这个错误表明Django的CSRF保护机制没有正确启用。注释掉中间件或使用@csrf_exempt是不推荐的解决方法,因为这会降低Web应用程序的安全性。
要解决此问题,可以采取以下步骤:
确保在Vue前端请求Django后端时,在请求头部添加"X-CSRFToken"键值对,值为浏览器cookie中的"csrftoken"。例如:
javascript
axios.post('http://localhost:8000/api/login/', {
username: 'example',
password: 'password'
}, {
headers: {
'X-CSRFToken': 'csrftoken value from browser cookie'
}
})
在Django后端视图函数中使用模板渲染(即通过render()返回html)时,确保包含{% csrf_token %}标签。例如:
html
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">Login</button>
</form>
</body>
</html>
注意:如果您使用的是Django Rest Framework,则需要在前端请求中添加上述的"X-CSRFToken"键值对,并在后端视图函数中使用@api_view装饰器和serializer_class定义视图和序列化器等组件。另外,如果您使用的是Vue.js框架,可以考虑使用vue-cookies插件来获取和设置浏览器cookie中的csrftoken。