Fla*_*avò 1 django cookies django-rest-framework
我有这个看法
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()
Run Code Online (Sandbox Code Playgroud)
和这个网址
urlpatterns = [
url(r'^login/$',views.obtain_auth_token, name='get_auth_token'),
url(r'^login2/$',ObtainAuthToken, name='get_auth_token'),
]
Run Code Online (Sandbox Code Playgroud)
我正在尝试像这样与邮递员一起发帖:
127.0.0.1:8000/api/login2/
Run Code Online (Sandbox Code Playgroud)
但我只能收到这个错误
Forbidden (CSRF cookie not set.): /api/login2/
[02/Jul/2017 22:49:11] "POST /api/login2/ HTTP/1.1" 403 2891
Run Code Online (Sandbox Code Playgroud)
我知道有数百个这样的帖子,我搜索了很长时间的解决方案,但似乎没有任何效果
像这样试过
urlpatterns = patterns('',
url('^login2/$', csrf_exempt(ObtainAuthToken)),
...
)
Run Code Online (Sandbox Code Playgroud)
这个
from django.utils.decorators import method_decorator
class LoginView(APIView):
@method_decorator(csfr_exempt)
def dispatch(self, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
还有这个
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt, name='dispatch')
class LoginView(APIView):
...
Run Code Online (Sandbox Code Playgroud)
和这个
@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)
Run Code Online (Sandbox Code Playgroud)
您需要使用ObtainAuthToken.as_view(). Any 会APIView自动使用csrf_exempt()(并在您使用时明确检查 CSRF 令牌SessionAuthentication),但如果您不使用.as_view(). 您不必csrf_exempt在什么之上明确使用APIView。
我不确定您为什么不使用第一个 url, /login/,但是如果您在使用该 url 时遇到问题,那么您修复它们的方法是错误的。
附带说明:csrf_exempt在函数上设置一个属性。因此,使用它post()绝对没有效果,因为中间件不会检查post()方法的属性。您需要在dispatch()method 或 as上使用它csrf_exempt(ObtainAuthToken.as_view())。
| 归档时间: |
|
| 查看次数: |
4603 次 |
| 最近记录: |