认证

认证的实现

使用步骤:

# 通过认证类完成,使用步骤
    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

相关文章

  • 轮播图前端

    轮播图组件 <template> <div id=”banner”> <el-carousel height=”400px”> <!– 将banner_list循环–> <el-carousel-item v-for=”item in banner_list” :key=”item”> <…

    2023年4月2日
    00
  • django中的路由层

    1.什么是路由层 简单来说,就是通过路由层中的path函数,告诉django遇到那个url,执行那个视图函数 2.路由层的请求流程 1.客户在浏览器输入网址→请求进入django的setting.py中的ROOT_URLCONF寻找指定使用的urls.py文件位置(如果中间件有路由功能,urls文件功能会被其替代) 2.Django会先匹配项目目录下的pat…

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

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

    2023年4月2日
    00
  • 基于django中间件的编程思想

    基于django中间件的编程思想 在django中,中间件的形式全部写成了列表套字符串的形式 MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middl…

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

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

    Python开发 2023年4月2日
    00
  • 进程、线程补充与协程相关介绍

    补充点 1.死锁 当你知道锁的使用抢锁必须要释放锁,其实你在操作锁的时候也极其容易产生死锁现象(整个程序卡死 阻塞) from threading import Thread, Lock import time mutexA = Lock() mutexB = Lock() # 类只要加括号多次 产生的肯定是不同的对象 # 如果你想要实现多次加括号等到的是相…

    Python开发 2023年4月2日
    00
  • 自动生成路由和action的使用

    自动生成路由 普通cbv视图形式的路由: path(‘books4/’, views.Book4View.as_view()), re_path(‘books4/(?P<pk>\d+)’, views.Book4DetailView.as_view()) 继承了ViewSetMixin及其子类的视图路由: path(‘books5/’, view…

    Python开发 2023年4月2日
    00
  • 修改密码弹出框搭建

    前端代码搭建 主要利用的是bootstrap3中js插件里的模态框版块 <li><a href=”” data-toggle=”modal” data-target=”.bs-example-modal-lg”>修改密码</a></li> <div class=”modal fade bs-example…

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