【发布时间】:2021-01-30 04:55:28
【问题描述】:
{"detail": "CSRF Failed: CSRF cookie not set."} postman 出错,我正在使用 django rest_framework 开发 ios android 后端。
当我第一次清除所有 cookie 并使用我的登录 api 时工作正常 这将根据我的代码为我提供有关用户的所有信息,但之后当我尝试使用 post 方法访问任何 api 时,它总是给 crsf 失败。 我还在 view 和 urls.py 中使用 csrf_exempt 装饰器,还尝试了大括号包中的 CsrfExemptMixin。 我的登录代码是
from django.contrib.auth import login,logout
from django.shortcuts import render,redirect
# local py files
from .models import *
from .serializers import *
from app_apis.models import *
# third party
from rest_framework import (generics,
permissions)
from knox.views import LoginView as KnoxLoginView
from rest_framework.response import Response
from rest_framework.authtoken.serializers import AuthTokenSerializer
from knox.models import AuthToken
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from braces.views import CsrfExemptMixin
from django.middleware.csrf import get_token
# Register API
class RegisterView(CsrfExemptMixin,generics.GenericAPIView):
serializer_class=RegisterUserSerializer
@method_decorator(csrf_exempt)
def post(self,request,*args, **kwargs):
serializer=self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
print
logout(request)
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)[1]
})
class LoginAPI(CsrfExemptMixin,KnoxLoginView):
permission_classes = (permissions.AllowAny,)
def get(self,request):
example={
"username":"user_name",
"password":"Your Password"
}
return Response(example)
@method_decorator(csrf_exempt)
def post(self, request, format=None):
serializer = AuthTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
user_id_main=user.id
user_name=user.username
user_data=[user_id_main,user_name]
print(user_data)
projects=ProjectTable.objects.filter(created_by_id=user_id_main).values_list('name')
project_names=projects
login(request, user)
temp_list=super(LoginAPI, self).post(request, format=None)
temp_list.data["project_list"]=project_names
temp_list.data["user_data"]=user_data
temp_list.data['csrf_token']=get_token(request)
return Response({"data":temp_list.data})
# logout
def logout_view(request):
logout(request)
return redirect("user_profile:login")
请指导我。提前谢谢
【问题讨论】:
-
据我所知,问题是邮递员没有获得 CSRF 令牌。我相信有一个设置可以在测试期间禁用 CSRF 令牌。执行
GET调用然后解析出CSRF 令牌的另一个选项。最好的选择是第一个选项。这可能会有所帮助:stackoverflow.com/questions/28983158/… -
感谢您的评论,但在我的情况下 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', # 'rest_framework.authentication.SessionAuthentication', ] 现在它正在工作,但我不知道如何.
标签: python-3.x django django-rest-framework django-views django-csrf