• Django-DRF认证


    一、drf认证功能介绍

    drf在请求进到视图函数的过程中,会进行认证相关的工作。

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

    二、认证功能源码分析

    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=[类1,类2]----》Request的self.authenticators就变成了我们配置的一个个类的对象
            
            
    2 self._authenticate(self):Request类的方法
    def _authenticate(self):
         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, ]
    	就会执行上面的方法,执行认证
    
    

    三、自定义认证类(重点)

    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_FRAMEWORK = {
            "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
            }
            
       -注意:
    	1 认证类,认证通过可以返回一个元组,有两个值,第一个值会给,request.user,第二个值会个request.auth
        2 认证类可以配置多个,按照从前向后的顺序执行,如果前面有返回值,认证就不再继续往下走了
    

    1.认证功能局部使用和全局使用

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

    四、自定义权限功能(重点)

    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
    

    1.权限功能局部使用和全局使用

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

    五、内置的权限和认证类

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

    六、select_related的使用

    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)
    
  • 相关阅读:
    iOS开发--UILabel可以显示
    网络编程之IO模型——IO模型比较分析
    网络编程之IO模型——异步IO
    网络编程之IO模型——多路复用IO
    网络编程之IO模型——非阻塞IO
    网络编程之IO模型——阻塞IO
    Linux基本命令
    Linux界面介绍
    Linux系统目录介绍
    Linux的前世今生
  • 原文地址:https://www.cnblogs.com/chiyun/p/14066654.html
Copyright © 2020-2023  润新知