2020-12-14 drf之自定义认证和权限

回顾

1 web应用模式开放模式

2 API接口

3 接口测试工具

4 restful规范(重点)

5 djangorestframework:drf,django的app,快速的写出符合restful规范的API接口

6 drf的执行流程(APIView源码:request对象,认证,权限,频率,捕获全局异常,响应对象)

7 序列化器(序列化,反序列化,数据校验):(重点******)

-Serializer
    -字段自己写,字段类型,字段属性
    -read_only  write_only
    -序列化:实例化得到对象:instance,many,data    (many=True:__call__)
    -对象.data:字典
    -反序列化
    -重写:create,update
    -返序列化的校验通过,修改会触发update,新增会触发create
    -反序列化的数据校验(三种方式):源码部分
    -扩展:source,SerializerMethodField
-ModelSerilalizer
    -内部类
        -class Meta:
            model = models.Book
            fields = '__all__'
            exclude=[]
            read_only_field=[]
            extra_kwargs={}
            depth=1
    -Serializer用法,重写字段,指定字段类型,字段参数
    -局部钩子,全局钩子
    -不需要重写create和update(经常看到重写)

8 请求和响应(次重点)

-Request
    -request.data
    -request.query_param
    -读源码:重写了__getattr__
-Response
    -客户端请求数据看到的样子(json,浏览器)
    -局部配置:在视图函数中renderer_classes = []
    -全局配置:setting中配置
        -drf默认有一套配置文件

9 视图(重点)

-2个视图基类:APIView和GenericAPIView
    -GenericAPIView:
        -queryset = None
        -serializer_class = None
        -get_queryset:获取要序列化的数据(可以重写,自己定制规则)
        -get_serializer:获取序列化类(可以重写,自己定制返回哪个序列化类)
        -get_object:返回单个对象,通过pk查的(可以重写,返回谁,单个对象就是谁)

-5个视图扩展类(rest_framework.mixins)
    CreateModelMixin:create方法创建一条
    DestroyModelMixin:destory方法删除一条
    ListModelMixin:list方法获取所有
    RetrieveModelMixin:retrieve获取一条
    UpdateModelMixin:update修改一条

-9个视图扩展类
    CreateAPIView:继承CreateModelMixin,GenericAPIView,有post方法,新增数据
    DestroyAPIView:继承DestroyModelMixin,GenericAPIView,有delete方法,删除数据
    ListAPIView:继承ListModelMixin,GenericAPIView,有get方法获取所有
    UpdateAPIView:继承UpdateModelMixin,GenericAPIView,有put和patch方法,修改数据
    RetrieveAPIView:继承RetrieveModelMixin,GenericAPIView,有get方法,获取一条

    ListCreateAPIView:继承ListModelMixin,CreateModelMixin,GenericAPIView,有get获取所有,post方法新增
    RetrieveDestroyAPIView:继承RetrieveModelMixin,DestroyModelMixin,GenericAPIView,有get方法获取一条,delete方法删除
    RetrieveUpdateAPIView:继承RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有get获取一条,put,patch修改
    RetrieveUpdateDestroyAPIView:继承RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView,有get获取一条,put,patch修改,delete删除

 -视图集
    ViewSetMixin:重写了as_view (一旦继承了它,路由就变了)

    ViewSet:      继承ViewSetMixin和APIView
    GenericViewSet:继承ViewSetMixin, generics.GenericAPIView

    ModelViewSet:继承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
    ReadOnlyModelViewSet:继承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet

10 路由(重点)

-三种方式配置路由
    -自动生成路由
        -导入SimpleRouter,实例化得到对象
        -router.register('book',视图类(必须继承ViewSetMixin及它的字类))
        -两种方式注册进路由中
            -urlpatterns += router.urls
            -urlpatterns = [
                ...
                url(r'^', include(router.urls))
                ]
     -半自动
        url(r'books/', BookView.as_view({'get':'list'}))
     -原始的
-action装饰器(也会自动生成路由)
    -127.0.0.1/books/get_new_5   detail=False
    -127.0.0.1/books/pk/get_new_5   detail=True
    -@action(methods=['put'], detail=True)
    def get_new_5(self, request,pk):
        return Response({'msg':'获取5条数据成功'})

今日内容

1、drf认证功能介绍

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

2、认证功能源码分析

-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_class=[Myauthen.LoginAuth,]就会执行上面的方法,执行认证

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 元组(两个参数,第一个是user,第二个可以是token)必须两个不然解压赋值会出错,或者返回None)
            else:
                raise AuthenticationFailed('您没有登录')
    -重写authenticate方法
    -局部使用和全局使用
        -局部:在视图类中配置(只要配置了,就是登录以后才能访问,没配置,不用登录就能访问)
        authentication_classes = [MyAuthen.LoginAuth, ]
        -全局,settings中配置
               REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ]
        }
    -注意
        1、认证类,认证通过可以返回一个元组,有两个值,第一个值会给request.user当前登录用户,第二个会给request.auth,返回给的token
        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): view就是那个视图类,可以拓展一些功能,后期可以从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]
    -全局使用,在settings中配置
          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

你可能感兴趣的:(2020-12-14 drf之自定义认证和权限)