认证

认证的实现

使用步骤:

# 通过认证类完成,使用步骤
    1 写一个认证类,继承BaseAuthentication
    2 重写authenticate方法,在内部做认证
    3 如果认证通过,返回2个值
    4 认证不通过抛AuthenticationFailed异常
    5 只要返回了两个值,在后续的request.user 就是当前登录用户

认证源码分析:

https://www.cnblogs.com/suncolor/p/16826105.html

认证组件的使用:
1.models.py中编写模型类

# 用户表
class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    def __str__(self):
        return self.username

# 用户登录记录表
# 如何区分用户是否登录了?
class UserToken(models.Model):
    # SET_NULL   SET_DEFAULT   CASCADE  SET(函数内存地址)
    user = models.OneToOneField(to='User', on_delete=models.CASCADE)
    token = models.CharField(max_length=32, null=True)  # 用户如果没有登录,就是空,如果登录了,就有值,登录多次以最后一次为准

2.views.py中判断登录信息

class UserView(ViewSet):
    authentication_classes = []
    @action(methods=['POST', ], detail=False, url_path='login')
    def login(self, request):
        # 取出前端传入的用户名密码,校验,通过,返回登录成功,失败就返回用户名密码错误
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        if user:
            # 登录成功,不同人生成的token是不一样的,谁登录的,就把token存到UserToken表中
            token = str(uuid.uuid4())  # 生成一个永不重复的随机字符串
            # 存UserToken:如果没有记录,就是新增,如果有记录更新一下即可
            # 通过user去UserToken表中查数据,如果能查到,使用defaults的数据更新,如果查不到,直接通过user和defaults的数据新增
            UserToken.objects.update_or_create(defaults={'token': token}, user=user)
            # 作用是为了添加数据时防止重复. 先去查询, 如果没有在创建, 如果有则更新.
            return Response({'code': 100, 'msg': '登录成功', 'token': token})
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})
  1. 在app中写一个认证类 app_auth.py
# 在app中写一个认证类 app_auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken
class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 认证逻辑,如果认证通过,返回两个值
        #如果认证失败,抛出AuthenticationFailed异常
        token=request.GET.get('token')
        if  token:
            user_token=UserToken.objects.filter(token=token).first()
            # 认证通过
            if user_token:
                return user_token.user,token
            else:
                raise AuthenticationFailed('认证失败')
        else:
            raise AuthenticationFailed('请求地址中需要携带token')

# 可以有多个认证,从左到右依次执行
# 全局使用,在setting.py中配置
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",]
}
# 局部使用,在视图类上写
authentication_classes=[MyAuthentication]
# 局部禁用
authentication_classes=[]

认证的配置

# 可以有多个认证,从左到右依次执行
# 全局使用,在setting.py中配置自己写的认证类
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",]
}
# 局部使用,在视图类上写自己定义的认证类
authentication_classes=[MyAuthentication]
# 局部禁用
authentication_classes=[]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:认证 - Python技术站

(0)
上一篇 2023年4月2日 下午4:42
下一篇 2023年4月2日 下午4:42

相关文章

  • django中APIView里的dispatch和as_view方法分析

    位置: from rest_framework.views import APIView 继承APIView类视图形式的路由: path(‘booksapiview/’, views.BooksAPIView.as_view()), #在这个地方应该写个函数内存地址 继承APIView类的视图函数: from rest_framework.views imp…

    Python开发 2023年4月2日
    00
  • 基本运算符

    基本运算符 算术运算符 print(10+2) # 加减乘除运算符 print(10 / 3) print(10 // 3) # 只保留整数部分 print(10 % 3) # 取余数 print(10 ** 3) # 幂方运算 比较运算符 <、>、>=、<=、==、!= 赋值运算符 # =:变量赋值 # +=、-=、*=、**=、/…

    Python开发 2023年4月2日
    00
  • 模板语法之标签

    语法 {% 开始标签 %} …. {% 结束标签%} if标签 例:{% if … %} {% elif %} {% else %} {% endif %} if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。 for标签 # for 标签带有一个可选的{% empty %…

    Python开发 2023年4月2日
    00
  • 关于编辑器和解释型编译型语言

    各种语言用到的编辑器 python开发:pycharm(收费),vscode(免费),sublintext, go开发:goland(收费),vscode,国产的 java:idea(收费),eclipse(免费),MyEclipse(收费) android:androidstudio(免费),eclipse+adt 前端:webstorm(收费) php:…

    Python开发 2023年4月2日
    00
  • 操作系统启动流程和BIOS介绍

    1.BIOS介绍 我们刚刚买回来的电脑裸机是可以直接启动的,这是由于生产厂商在电脑出厂的时候就在电脑里编写了一个只可读的系统功能BIOS,该系统被写入了ROM(只读内存中) BIOS是一个过渡性的操作系统,当安装了window等其他操作系统时,该系统会被快速的代替 2.操作系统的启动流程 1.计算机通电2.BIOS开始运行,检测硬件:cpu、内存、硬盘等3.…

    2023年4月2日
    00
  • django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式;CBV是指视图函数以类的方式。 2.普通FBV形式 def index(request): return HttpResponse(‘index’) 3.CBV形式 3.1 CBV形式的路由 path(r’^login/’,views.MyLogin.as_view()) 3.2 CBV形式的视图…

    Python开发 2023年4月2日
    00
  • 存储器详解

    存储器有五种类型,分别是寄存器、高速缓存、内存、磁盘、磁带。 他们访问读取的时间和容量如下图: 1.寄存器L1缓存 用的是与cpu一样的材质制成,读取和cpu一样快,容量<1KB 2.高速缓存L2缓存 存放的是cpu经常使用的数据 3.内存 内存又称RAM,ROM又称只读内存,ROM内存放着计算机厂商写死在计算机上的一段核心程序–BIOSCMOS:存…

    2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部