drf-----认证组件

news/2024/6/18 21:21:58 标签: html, 前端
htmledit_views">

认证组件

认证组件使用步骤(固定用法)

1 写一个类,继承BaseAuthentication
    2 在类中写:authenticate
    3 在方法中,完成登录认证,如果 不是登录的,抛异常
    4 如果是登录的,返回登录用户和token
    
    5 在视图类中,使用认证类(局部使用)
    class BookView(APIView):
        authentication_classes = [LoginAuth, ] 
     
    6 全局使用:
    # 全局使用
    ### 重点:不要在配置文件中,导入莫名其妙的包
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'app01.auth.LoginAuth'
        ],

    }
    
    7 全局使用后,局部禁用
    class UserView(ViewSet):
        # 局部禁用
        authentication_classes = []
    
    8 认证类的使用顺序
        -优先用视图类配置的
        -其次用项目配置文件
        -最后用drf默认的配置
       
# 小重点;一旦通过认证,在request中就有当前登录用户
    def get(self, request):
        # 一旦通过认证,在request中就有当前登录用户
        print(request.user.name,'访问了接口')

 登录部分代码

from rest_framework.viewsets import ViewSet
import uuid
class UserView(ViewSet):
    authentication_classes = [Actions, ]        #认证
    @action(methods=['POST'],detail=False)
    def login(self,request):
        username=request.data.get('username')
        password=request.data.get('password')
        # token=request.MITA.get('HTTP_TOKEN')
        user=models.User.objects.filter(username=username,password=password).first()
        if user:
            token=str(uuid.uuid4())
            models.UserToken.objects.update_or_create(user_id=user.id,defaults={'token':token})
            return Response({'code':100,"msg":'登陆成功','token':token})
        return Response({'code':101,"msg":'用户名或密码错误'})

  

models.UserToken.objects.update_or_create(user_id=user.id,defaults={'token':token})

user_id=user.id根据这个条件去数据库中查询,没有查询到,就根据defaults={'token':token})

重新创建,查询到了,和defaults={'token':token})不一样,就更新

 认证类

class Actions(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        print(token)
        user_token = models.UserToken.objects.filter(token=token).first()
        if user_token:
            user=user_token.user   # 当前登录用户就是user
            return user, token
        else:
            raise AuthenticationFailed('认证不通过')


http://www.niftyadmin.cn/n/359373.html

相关文章

Java的4种内部类的使用方式及适用场景

Java中有四种形式的内部类,在开发的过程中需要理清楚何时使用合适的内部类,内部类用好了可以提高编码效率、更好的实现封装、甚至可以巧妙实现多继承。当然,某些内部类用多了会削弱面向对象的设计思想,所以内部类不可滥用&#xf…

由于过多的连接错误而被 MySQL服务器 阻止

Caused by: com.mysql.cj.exceptions.CJException: null, message from server: "Host 10.105.***.** is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 这个错误可能表示当您尝试使用 IP 地址为 "10.105.***.**" 的…

YOLOv5【训练train.py逐行源码及参数调参解析】超详细解读!!!建议收藏✨✨!

之前的文章介绍了YOLOv5的网络结构🚀与目录结构源码🚀以及detect.py🚀的详细解读,今天带来的是YOLOv5的 train.py 代码参数逐行解读以及注释,废话不多说,让我们一起学习YOLOv5的 train.py 源码吧&#xff0…

低代码平台名声臭,用起来却真香——90%重复工作给你完成喽

一、前言 开发过程中,只是觉得前端后端合起来,有很多冗余信息,被代码一遍遍重复表达,是一件很枯燥、无聊的事情。 这些枯燥的重复工作,完全可以由机器来做,以便解放出我们的时间,来做更有价值的…

Revit建模|怎么创建轴网标高?

大家好,这里是建模助手,今天给大家讲一讲怎么创建轴网标高。 标高用来定义楼层层高以及生成平面视图,轴网用于为构件定位,在Revit中轴网确定了一个不可见的工作平面,轴网编号以及标高符号样式均可定制修改。目前&…

电力应急指挥需要哪些终端设备?

在电力应急现场,我们可能会面临很多复杂的情况,当发生电力险情时,现场可能会面临断电、断网、无路等问题。此时应急指挥中心很难第一时间掌控现场情况,指挥中心无法快速做出反应,无法对现场情况做出高效的应急处置决定…

uni-app开发小程序使用uni.chooseMedia选择图片,安卓手机无法选择图片

uni-app开发小程序时,使用uni.chooseMedia选择图片,苹果手机是正常的,安卓手机无法打开手机选择图片 问题复现解决方法!!我的反思与总结 问题复现 一、在小程序中,选择图片并上传,是一个很常见…

游戏平台推广怎么做?

游戏平台的推广渠道很多,要想为自己的游戏品牌进行宣传,首先要知道如何寻找并利用资源。所谓的资源,就是指网络上的资源。网络上的宣传,有很多种方式,比如论坛、聊天群等等,都是年轻人最喜欢去的地方。利用…