美文网首页
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认证组件的使用

    daphne报错,很尴尬,查的时候发现另一个方案更符合需求 第一步:注册认证组件并配置 注意:在settings....

  • DRF之认证组件

    认证组件源码 我们进去我们的认证看下image.png 我们这个权限组件返回的是request.user我们的in...

  • DRF认证,权限,限流,流程

    drf十大组件 认证 权限(授权) 用户访问次数/频率限制 版本 解析器(parser) 序列化 分页 路由...

  • drf 的权限问题和 serializer 问题

    drf 基本的权限认证使用 permission_classes 配置它会调用内部的 get_permission...

  • DRF的认证,权限,节流,版本,解析器

    1;DRF的认证,权限:认证和权限是一起配合使用的。可以再配置文件中settings配置全局默认的认证&权限 也可...

  • DRF十大主键

    认证 权限 局部使用 全局的设定 节流 局部使用 全局设置 使用DRF内置的限频类 全局设置 版本 解析器 因为开...

  • DRF十大组件

    DRF十大组认证实现 ##############################################...

  • DRF认证

    单独看用法 你定义了一个类CBV,类继承自APIView,在里面赋值authentication_classes字...

  • DRF使用记录(一) 初体验

    drf使用记录(一) drf初体验 drf(Django REST framework) 下面简单体验一下drf ...

  • tokenAuth 认证模式

    一、drf tokenAuth 认证模式https://www.django-rest-framework.org...

网友评论

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

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