zoukankan      html  css  js  c++  java
  • Drf框架之四 drf认证功能,认证功能源码分析 自定义认证类 认证功能布局使用和全局使用 自定义权限功能 权限功能局部使用和全局使用 内置的权限和认证类

    drf认证功能,认证功能源码分析 自定义认证类  认证功能布局使用和全局使用 自定义权限功能 权限功能局部使用和全局使用  内置的权限和认证类

    一、drf认证功能介绍

    1 认证、频率、权限
    2 用户是否登录到系统中
    3 后期基本上会用JWT的认证
    4 自定制的认证

    二、认证功能源码分析

    1、APIView--->dispatch--->self.initial(request,*args,**kwargs)---->
    self.perform_authentication(request)--->Request.user--->self._authenticate(self):Request类的方法
    --->self.authenticators:Request类的属性---》在Request对象实例化的时候传入的--->Request在什么时候实例化?dispatch的时候--
    ---》APIView:self.get_authenticators()-->return [auth() for auth in self.authentication_classes]--->如果在自己定义
    的视图类中写了authentication_classes=[类2,类2]-->Request的self.authenticators就变成了我们配置的一个个类的对象
    源码分析


    2 self._authenticate(self):Request类的方法
    def _authenticate(sel):
      for authenticator in self.authenticators: #BookView中配置的一个个类的对象
        try:
          user_auth_tuple = authenticator.authenticate(self)
        except  exceptions.APIException:
            self._not_authenticated()
            raise

        if user_auth_tuple is not None:
            self._authenticator = authenticator
            self.user,self.auth = user_auth_tuple
            return

    3只要在视图类中配置authentication_classes = [MyAuthen.LoginAuth, ]
    就会执行上面的方法,执行认证

    在源码中的执行流程

    运行到APIView中的dispatch

    执行dispatch中的initial

    执行认证函数

    在认证函数中,执行request.user

    在Reuqest类中执行self._authenticate()

    接下来2张图是Request在实例化时所作的事情

     3 自定义认证类(重点)

    1 使用
        定义一个类,继承BaseAuthentication
    class LoginAuth(BaseAuthentication): def authenticate(self,request): token = request.GET.get('token') res = models.UserToken.objects.filter(token=token).first()
              if res:
                return 元组 ()返回的元组有什么意义
              else:
                raise AuthenticationFailed('您没有登录')
    重写authenticate方法
    局部使用和全局使用
    局部:
      在视图类中配置(只要配置了,就是登录后才可以访问,没配置,不用登录就能访问)
        authentication_classes = [MyAuthen.LoginAuth,]
    全局:
      REST_FRAMWORK = {'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuthen.LoginAuth'],}

    注意:
    1 认证类,认证可以通过可以返回一个元组,有两个值,第一个值会给,request.user,第二个值会给request.auth
    2认证类可以配置多个,按照从前往后的顺序执行,如果前面有返回值,认证就不再继续往下走了


    4 认证功能局部使用和全局使用

    1 全局使用(所有接口,都需要登录后才能访问)
    在配置文件中:
    REST_FRAMEWORK = {
            "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
            }
    2 局部使用
        -在想局部使用的视图类上
        authentication_classes = [MyAuthen.LoginAuth,]
    3 局部禁用
        -在想禁用的视图类上
        authentication_classes = []
        

    5 自定义权限功能(重点)

    1 登录成功后,超级用户可以干某些事,普通用户不能干-->超级用户可以查看 某些接口,普通用户不能查看
    
    2 使用写一个类继承BasePermission,重写has_permission
    class SuperPermission(BasePermission):
        def has_permission(self,request,view):
        
            # Return `True` if permission is granted, `False` otherwise.
                # 超级用户可以访问,除了超级用户以外,都不能访问
                if request.user.user_type == '1':
                    return True
                else:
                    return False
    
    3 局部使用和全局使用
        -在想局部使用的视图类上
        permission_classes = [MyAuthen.SuperPermission]
        -全局使用
          REST_FRAMEWORK = {
            "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
            }
         -局部禁用
        permission_classes = []

    6 权限功能局部使用和全局使用

    1 使用方式
        -在想局部使用的视图类上
        permission_classes = [MyAuthen.SuperPermission]
        -全局使用
          REST_FRAMEWORK = {
            "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ]
            }
         -局部禁用
        permission_classes = []

    7 内置的权限和认证类

    # 内置认证类
    from rest_framework.exceptions import AuthenticationFailed
    # 内置权限类
    from rest_framework.permissions import BasePermission

    拓展

    1 select_related的使用
    articleList=models.Article.objects.select_related("category").all()
    for article_obj in articleList:
            #  Doesn't hit the database, because article_obj.category
            #  has been prepopulated in the previous query.
            #不再查询数据库,因为第一次查询,数据已经填充进去了
            print(article_obj.category.title)
            
    2 mysql的悲观锁和乐观锁
    
    3 drf内部内置了一些认证类,分别干了什么事
  • 相关阅读:
    PosegreSQL基础回顾(第 5 章 数据定义)
    PosegreSQL基础回顾(第 4 章 SQL语法)
    大数据学习2(伪分布式搭建)
    大数据学习2(MapReduce)
    大数据学习1(HDFS)
    Linux find用法
    shell循环
    查询一次数据库给多个变量赋值
    linux cut用法
    linux权限
  • 原文地址:https://www.cnblogs.com/ltyc/p/13955352.html
Copyright © 2011-2022 走看看