美文网首页
DRF之TokenAuthenticationz认证组件的使用

DRF之TokenAuthenticationz认证组件的使用

作者: 向日葵1884 | 来源:发表于2020-04-14 10:33 被阅读0次

    daphne报错,很尴尬,查的时候发现另一个方案更符合需求

    第一步:注册认证组件并配置

    INSTALLED_APPS = [
       ...
        'rest_framework',
        'rest_framework.authtoken',
       ...
    ]
    
    REST_FRAMEWORK = {
        ...
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
        )
        ...
    }
    
    

    注意:在settings.py中添加这个app后,它会帮我们在数据库中生成一张authtoken表,所以我们要确保manage.py migrate在更改设置后运行。

    第二步:设计登录和登出的URL

    from django.urls import path
    
    urlpatterns = [
        path('login', LoginView.as_view()),
        path('logout', LogoutView.as_view()),
    ]
    
    

    第三步:views类的编写

    from rest_framework.authtoken.views import ObtainAuthToken
    from rest_framework.authtoken.models import Token
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    class LoginView(ObtainAuthToken):
        def post(self, request, *args, **kwargs):
            # 自定义返回结果的格式
            ret = BaseResponse.BaseResponse()
            # 从request中获取数据, 数据格式必须为 {"username":"用户名","password":"密码"}
            serializer = self.serializer_class(data=request.data, context={'request': request})
            if serializer.is_valid():
                # 获取user对象
                user = serializer.validated_data['user']
                # 每次用户登录时先删除Token再重新生成Token
                Token.objects.filter(user=user).delete()
                # 生成新的Token
                token, created = Token.objects.get_or_create(user=user)
                # 自定义返回内容
                ret.msg = "登录成功!"
                ser_obj = UserProfileSerializer(user)    # 编写好User对象的序列化器
                ret.data = ser_obj.data
                ret.token = token.key
            else:
                # 登录失败时返回的内容
                ret.code = 1013
                ret.msg = "登录失败!用户名或密码错!"
            return Response(ret.dict)
    
    class LogoutView(APIView):
        queryset = UserProfile.objects.all()
    
        def get(self, request):
            ret = BaseResponse.BaseResponse()
            try:
                # 退出时删除用户登录时生成的Token
                Token.objects.filter(user=request.user).delete()
                ret.msg = "退出成功!"
            except Exception as e:
                ret.code = 1013
                ret.msg = str(e)
            return Response(ret.dict)
    
    
    • BaseResponse类的代码示例
    class BaseResponse(object):
        def __init__(self):
            self.code = 1000
            self.msg = ""
            self.data = None
            self.token = ""
    
        @property
        def dict(self):
            return self.__dict__
    
    
    image

    登录后前端的请求条件

    image

    转自:https://my.oschina.net/zerobit/blog/3142984

    相关文章

      网友评论

          本文标题:DRF之TokenAuthenticationz认证组件的使用

          本文链接:https://www.haomeiwen.com/subject/nuhzmhtx.html