目录
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件事(认证组件|权限组件|限流组件);
仅支持get请求;
python中实现抽象类
注:这样写用于规范子类的行为(框架中规范),如果没有此规范要人为约定(容易出错),父类中的方法用@abc.abstractmethod包装后,在子类中必须重写此方法,否则报NotImplementedError未实现错误,java要这样写,py中可不用;
注:也是规定子类行为,不用@abc.abstractmethod;
两种方式均可;
django校验
注:序列化类中校验,局部|全局|函数,3种方式;
序列化多条many=True源码
serializers.ModelSerializer
serializer高级用法
serializer的read_onoy和write_only
instance和validated_data的数据是对应的;
23种设计模式
视图中queryset简写
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())
rest_framework.generics下
ListAPIView|CreateAPIView|UpdateAPIView|RetrieveAPIView|DestroyAPIView;
ListCreateAPIView|RetrieveUpdateAPIView|RetrieveUpdateDestroyAPIView;
最后rest_framework.viewsets import ModelViewSet
神奇的是ViewSetMixin(源码分析),重写了as_view();
视图3行,路由2行实现5个接口;
路由总结|action的使用
认证|权限|频率|过滤|排序
认证类|权限类|限流类均继承APIException,所以可以只捕获APIException;
自定义封装Response
自定义全局异常处理
异常处理,用于统一接口返回;
django模型
on_delete=models.CASCADE # 危险,要想清楚哪些用级联删除哪些不能
models.DO_NOTHING
models.PROTECT
时间字段
auto_now_add=True # 只要记录创建,不需要手动插入时间,自动把当前时间插入
auto_now=True # 只要更新,就会把当前时间插入
default=datetime.datetime.now # 注意不能加括号,加了括号就是项目开始执行的时间(所有记录时间都一样)
抽象表
同django.contrib.auth.models import AbstractUser,不创建表;
外键相关
publish=models.ForeignKey(to=Publish) # to_field默认不写,会关联到Publish主键上
db_cnotallow=False # 逻辑上的关联(代码控制),实际上数据层面没有此关联,增删不受外键影响(orm查询不影响)
authordetail=OneToOneField(to=AuthorDetail,db_cnotallow=False,on_delete=models.CASCADE) # 一对一关系,写在查询频率高的一边;本质就是FK+unique
多对多
多对多关系写在查询次数多的一边;
第三张表只有关联字段,用自动;第三张表有扩展字段,只能手动;
models.ImageField
ImageField中的upload_to='icon'的路径是在MEDIA_ROOT定义下的icon/;
只要使用自定义的用户表,一定要定义AUTH_USER_MODEL;
分页
频率
自动生成接口文档
注:继承APIView的也可加在方法下面;
另swagger;
http://test/docs/
JWT
注:如果使用自定义的User(AbstractUser)要在settings.py中配置AUTH_USER_MODEL='APP_NAME.表名;
payload=jwt_payload_handler(user)生成payload(第二段);
token=jwt_encode_handler(payload)生成token;
payload=jwt_decode_handler(jwt_value)将三段分解(认证是否篡改|是否过期)并取出payload;
self.authenticate_credentials(payload)生成user对象;
authentication_classes=[JSONWebTokenAuthentication,]
permission_classes=[IsAuthenticated,]
这2个类连用才能完成控制用户登录访问哪些东西;只用JSONWebTokenAuthentication游客可以访问;
base64
RBAC
role-based access control
django中,后台的权限控制:6张表;
前台(主站),用三大认证,认证|权限|控制;