django报错
Forbidden (CSRF cookie not set.): /predict_department/ [22/Feb/2024 15:01:12] “POST /predict_department/ HTTP/1.1” 403 2869
这个错误是由于 Django 的 CSRF(Cross-Site Request Forgery)保护机制导致的。
CSRF 是一种攻击方式,通过伪装用户的请求来执行未经授权的操作。
为了防止这种攻击,Django 默认情况下会要求在进行 POST 请求时携带 CSRF 令牌。
方法一:
- 在你创建的项目中,找到settings.py文件
- 文件settings.py 找到 MIDDLEWARE参数
- 注释掉’django.middleware.csrf.CsrfViewMiddleware’
方法二:
包含 CSRF 令牌: 在发送 POST 请求时,在请求头中包含 CSRF 令牌。您可以通过以下方式获取 CSRF 令牌并包含在请求中:
fetch('http://127.0.0.1:8000/api/predict_department/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': getCookie('csrftoken') // 获取 CSRF 令牌的函数
},
body: JSON.stringify({
'patient_complaint': 'complaint',
'age': 30,
'gender': 'male'
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
请注意,上述代码中的 getCookie(‘csrftoken’) 函数应该用于从 Cookie 中获取 CSRF 令牌。
方法三:
禁用 CSRF 保护: 如果您确定您的应用不容易受到 CSRF 攻击,并且决定禁用 CSRF 保护,您可以在 Django 视图函数中添加 @csrf_exempt 装饰器来禁用 CSRF 保护:
# prediction/views.py
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@api_view(['POST'])
def predict_department(request):
# 视图函数代码
请注意,禁用 CSRF 保护可能会增加您的应用受到 CSRF 攻击的风险,因此建议仅在明确了解风险并采取其他安全措施的情况下使用。