【问题标题】:hi i am getting "CSRF Failed and CSRF cookie not set." error您好,我收到“CSRF 失败且 CSRF cookie 未设置”。错误
【发布时间】: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


【解决方案1】:

不要在DEFAULT_AUTHENTICATION_CLASSES中使用rest_framework.authentication.SessionAuthentication

参考链接:https://stackoverflow.com/a/56101653/217586

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2013-11-05
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2014-03-11
    • 2021-02-08
    • 2017-05-05
    相关资源
    最近更新 更多