天天看点

DRF学习笔记(2)

目录​

​​django的View|局部禁用csrf 1​​​

​​python中实现抽象类 3​​​

​​django校验 5​​​

​​序列化多条many=True源码 6​​​

​​serializers.ModelSerializer 7​​​

​​serializer高级用法 8​​​

​​23种设计模式 10​​​

​​视图中queryset简写 10​​​

​​视图总结 10​​​

​​路由总结|action的使用 13​​​

​​认证|权限|频率|过滤|排序 15​​​

​​自定义封装Response 19​​​

​​自定义全局异常处理 20​​​

​​django模型 20​​​

​​时间字段 21​​​

​​抽象表 21​​​

​​外键相关 22​​​

​​多对多 23​​​

​​models.ImageField 23​​​

​​分页 24​​​

​​频率 24​​​

​​自动生成接口文档 25​​​

​​JWT 27​​​

​​base64 29​​​

​​RBAC 29​​​

​​django缓存 30​​​

rest_framework.settings中有默认配置;​

django模型中不能有2个自增字段;​

django的View|局部禁用csrf​

django的View,as_view(),dispatch()重要;​

drf的APIView(View),as_view(),dispatch(),dispatch()里的self.initial()做了3件事(认证组件|权限组件|限流组件);​

DRF学习笔记(2)

仅支持get请求;​

DRF学习笔记(2)
DRF学习笔记(2)

python中实现抽象类​

DRF学习笔记(2)

注:这样写用于规范子类的行为(框架中规范),如果没有此规范要人为约定(容易出错),父类中的方法用@abc.abstractmethod包装后,在子类中必须重写此方法,否则报NotImplementedError未实现错误,java要这样写,py中可不用;​

DRF学习笔记(2)

注:也是规定子类行为,不用@abc.abstractmethod;​

两种方式均可;​

django校验​

DRF学习笔记(2)

注:序列化类中校验,局部|全局|函数,3种方式;​

序列化多条many=True源码​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

serializers.ModelSerializer​

DRF学习笔记(2)
DRF学习笔记(2)

serializer高级用法​

serializer的read_onoy和write_only​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

instance和validated_data的数据是对应的;​

23种设计模式​

DRF学习笔记(2)

视图中queryset简写​

DRF学习笔记(2)

queryset = Book.objects # 或Book.objects.all()都可​

视图总结​

GenericAPIView,使用queryset|serializer_class就可快速提供5个接口(单个增,单个删,单个获取,单个更新,获取全部);​

GenericAPIView和5个视图扩展类(ListModelMixin|CreateModelMixin|UpdateModelMixin|DestroyModelMixin|RetrieveModelMixin)写接口;​

path('book/', views.BookView.as_view()),​

re_path('book/(?<pk>\d+), views.BookDetailView.as_view())​

DRF学习笔记(2)
DRF学习笔记(2)

rest_framework.generics下​

ListAPIView|CreateAPIView|UpdateAPIView|RetrieveAPIView|DestroyAPIView;​

ListCreateAPIView|RetrieveUpdateAPIView|RetrieveUpdateDestroyAPIView;​

最后rest_framework.viewsets import ModelViewSet​

神奇的是ViewSetMixin(源码分析),重写了as_view();​

视图3行,路由2行实现5个接口;​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

路由总结|action的使用​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

认证|权限|频率|过滤|排序​

DRF学习笔记(2)
DRF学习笔记(2)

认证类|权限类|限流类均继承APIException,所以可以只捕获APIException;​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

自定义封装Response​

DRF学习笔记(2)
DRF学习笔记(2)

自定义全局异常处理​

DRF学习笔记(2)

异常处理,用于统一接口返回;​

django模型​

on_delete=models.CASCADE # 危险,要想清楚哪些用级联删除哪些不能​

models.DO_NOTHING​

models.PROTECT​

时间字段​

DRF学习笔记(2)

auto_now_add=True # 只要记录创建,不需要手动插入时间,自动把当前时间插入​

auto_now=True # 只要更新,就会把当前时间插入​

default=datetime.datetime.now # 注意不能加括号,加了括号就是项目开始执行的时间(所有记录时间都一样)​

抽象表​

同django.contrib.auth.models import AbstractUser,不创建表;​

DRF学习笔记(2)

外键相关​

DRF学习笔记(2)

publish=models.ForeignKey(to=Publish) # to_field默认不写,会关联到Publish主键上​

db_cnotallow=False # 逻辑上的关联(代码控制),实际上数据层面没有此关联,增删不受外键影响(orm查询不影响)​

DRF学习笔记(2)

authordetail=OneToOneField(to=AuthorDetail,db_cnotallow=False,on_delete=models.CASCADE) # 一对一关系,写在查询频率高的一边;本质就是FK+unique​

多对多​

DRF学习笔记(2)

多对多关系写在查询次数多的一边;​

第三张表只有关联字段,用自动;第三张表有扩展字段,只能手动;​

DRF学习笔记(2)

models.ImageField​

DRF学习笔记(2)

ImageField中的upload_to='icon'的路径是在MEDIA_ROOT定义下的icon/;​

只要使用自定义的用户表,一定要定义AUTH_USER_MODEL;​

DRF学习笔记(2)

分页​

DRF学习笔记(2)

频率​

DRF学习笔记(2)
DRF学习笔记(2)

自动生成接口文档​

DRF学习笔记(2)
DRF学习笔记(2)

注:继承APIView的也可加在方法下面;​

DRF学习笔记(2)

另swagger;​

​​http://test/docs/​​​

JWT​

DRF学习笔记(2)
DRF学习笔记(2)
DRF学习笔记(2)

注:如果使用自定义的User(AbstractUser)要在settings.py中配置AUTH_USER_MODEL='APP_NAME.表名;​

DRF学习笔记(2)
DRF学习笔记(2)

payload=jwt_payload_handler(user)生成payload(第二段);​

token=jwt_encode_handler(payload)生成token;​

payload=jwt_decode_handler(jwt_value)将三段分解(认证是否篡改|是否过期)并取出payload;​

self.authenticate_credentials(payload)生成user对象;​

DRF学习笔记(2)

authentication_classes=[JSONWebTokenAuthentication,]​

permission_classes=[IsAuthenticated,]​

这2个类连用才能完成控制用户登录访问哪些东西;只用JSONWebTokenAuthentication游客可以访问;​

DRF学习笔记(2)

base64​

DRF学习笔记(2)
DRF学习笔记(2)

RBAC​

role-based access control​

django中,后台的权限控制:6张表;​

前台(主站),用三大认证,认证|权限|控制;​

DRF学习笔记(2)

django缓存​

DRF学习笔记(2)