【问题标题】:Django REST Framework Forbidden CSRF cookie not set未设置 Django REST Framework Forbidden CSRF cookie
【发布时间】:2017-12-06 02:33:16
【问题描述】:

我有这个观点

from rest_framework import parsers, renderers
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.serializers import AuthTokenSerializer
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import EmailUserSerializer
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt


@method_decorator(csrf_exempt, name='post')
class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        user_serializer = EmailUserSerializer(user)
        return Response({'token': token.key, 'user': user_serializer.data})


obtain_auth_token = ObtainAuthToken.as_view()

还有这个网址

urlpatterns = [
    url(r'^login/$',views.obtain_auth_token, name='get_auth_token'),
    url(r'^login2/$',ObtainAuthToken, name='get_auth_token'),
]

我正在尝试像这样使用邮递员发帖:

127.0.0.1:8000/api/login2/

但我只能收到这个错误

Forbidden (CSRF cookie not set.): /api/login2/
[02/Jul/2017 22:49:11] "POST /api/login2/ HTTP/1.1" 403 2891

我知道有数百个这样的帖子,我搜索了很长时间的解决方案,但似乎没有任何效果

这样尝试过

urlpatterns = patterns('',
    url('^login2/$', csrf_exempt(ObtainAuthToken)),
    ...
)

这个

from django.utils.decorators import method_decorator
class LoginView(APIView):
   @method_decorator(csfr_exempt)
   def dispatch(self, *args, **kwargs):
       ...

还有这个

from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class LoginView(APIView):
       ...

还有这个

@method_decorator(csrf_exempt, name='post')
class ObtainAuthToken(APIView):
    throttle_classes = ()
    ...
    @csrf_exempt
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)

【问题讨论】:

  • 试试@method_decorator(csrf_exempt, name='post') -> @csrf_exempt... 看看能不能解决问题?
  • 你是这个意思吗? @method_decorator(csrf_exempt, name='post') 类获取AuthToken(APIView):throttle_classes = () ... @csrf_exempt def post(self, request, *args, **kwargs): serializer = self.serializer_class(data=request .data) ...仍然无法正常工作

标签: django cookies django-rest-framework


【解决方案1】:

您需要使用ObtainAuthToken.as_view()。任何APIView 都会自动使用csrf_exempt()(如果您使用SessionAuthentication,则显式检查CSRF 令牌),但如果您不使用.as_view(),这将不起作用。您不必在 APIView 的作用之上明确使用 csrf_exempt

我不确定您为什么不使用第一个网址 /login/,但如果您对该网址有疑问,那么您就走错路了。

附带说明:csrf_exempt 设置函数的属性。因此,在post() 上使用它绝对没有效果,因为中间件不会检查post() 方法上的属性。您需要在dispatch() 方法或csrf_exempt(ObtainAuthToken.as_view()) 上使用它。

【讨论】:

  • 这实际上拯救了我的一天!顺便说一句,我没有使用第一次登录,因为我试图实现一个不同的版本......现在它工作得很好,感谢 as_view() !谢谢
猜你喜欢
  • 2013-05-12
  • 2017-05-05
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2013-03-28
  • 2012-05-03
  • 2016-11-26
相关资源
最近更新 更多