当前位置 : 主页 > 编程语言 > python >

DRF学习笔记(2)

来源:互联网 收集:自由互联 发布时间:2022-08-10
目录 ​ ​​ django的View|局部禁用csrf 1 ​​ ​ ​​ python中实现抽象类 3 ​​ ​ ​​ django校验 5 ​​ ​ ​​ 序列化多条many=True源码 6 ​​ ​ ​​ serializers.ModelSerializer 7 ​​ ​ ​


目录

​​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)_restframework


仅支持get请求;

DRF学习笔记(2)_DRF_02


DRF学习笔记(2)_django_03



python中实现抽象类​

DRF学习笔记(2)_django_04


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

DRF学习笔记(2)_DRF_05


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

两种方式均可;


django校验​

DRF学习笔记(2)_django-rest-framewor_06


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


序列化多条many=True源码​

DRF学习笔记(2)_django_07



DRF学习笔记(2)_DRF_08


DRF学习笔记(2)_restframework_09


DRF学习笔记(2)_django_10



serializers.ModelSerializer​

DRF学习笔记(2)_DRF_11



DRF学习笔记(2)_django-rest-framewor_12



serializer高级用法​

serializer的read_onoy和write_only

DRF学习笔记(2)_django-rest-framewor_13


DRF学习笔记(2)_restframework_14



DRF学习笔记(2)_django_15


DRF学习笔记(2)_DRF_16



DRF学习笔记(2)_restframework_17


instance和validated_data的数据是对应的;




23种设计模式​

DRF学习笔记(2)_django-rest-framewor_18



视图中queryset简写​

DRF学习笔记(2)_DRF_19


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)_restframework_20


DRF学习笔记(2)_django_21


rest_framework.generics下

ListAPIView|CreateAPIView|UpdateAPIView|RetrieveAPIView|DestroyAPIView;

ListCreateAPIView|RetrieveUpdateAPIView|RetrieveUpdateDestroyAPIView;


最后rest_framework.viewsets import ModelViewSet

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

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

DRF学习笔记(2)_restframework_22


DRF学习笔记(2)_django-rest-framewor_23


DRF学习笔记(2)_django-rest-framewor_24



DRF学习笔记(2)_restframework_25




路由总结|action的使用​

DRF学习笔记(2)_django-rest-framewor_26


DRF学习笔记(2)_restframework_27


DRF学习笔记(2)_DRF_28




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

DRF学习笔记(2)_django_29


DRF学习笔记(2)_django-rest-framewor_30


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

DRF学习笔记(2)_DRF_31



DRF学习笔记(2)_django-rest-framewor_32


DRF学习笔记(2)_DRF_33



DRF学习笔记(2)_django-rest-framewor_34


DRF学习笔记(2)_restframework_35


DRF学习笔记(2)_DRF_36



自定义封装Response​

DRF学习笔记(2)_restframework_37


DRF学习笔记(2)_restframework_38



自定义全局异常处理​

DRF学习笔记(2)_DRF_39


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



django模型​

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

models.DO_NOTHING

models.PROTECT


时间字段​

DRF学习笔记(2)_django_40


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

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

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


抽象表​

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

DRF学习笔记(2)_DRF_41



外键相关​

DRF学习笔记(2)_django_42


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


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

DRF学习笔记(2)_restframework_43



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


多对多​

DRF学习笔记(2)_django_44


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

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


DRF学习笔记(2)_django-rest-framewor_45



models.ImageField​

DRF学习笔记(2)_DRF_46


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

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

DRF学习笔记(2)_DRF_47




分页​

DRF学习笔记(2)_django-rest-framewor_48


频率​

DRF学习笔记(2)_django-rest-framewor_49


DRF学习笔记(2)_django_50



自动生成接口文档​

DRF学习笔记(2)_django_51


DRF学习笔记(2)_DRF_52


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

DRF学习笔记(2)_restframework_53


另swagger;


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



JWT​

DRF学习笔记(2)_DRF_54


DRF学习笔记(2)_django_55


DRF学习笔记(2)_django_56


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


DRF学习笔记(2)_DRF_57


DRF学习笔记(2)_DRF_58


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)_DRF_59


authentication_classes=[JSONWebTokenAuthentication,]

permission_classes=[IsAuthenticated,]

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


DRF学习笔记(2)_DRF_60



base64​

DRF学习笔记(2)_restframework_61


DRF学习笔记(2)_django_62




RBAC​

role-based access control

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

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

DRF学习笔记(2)_restframework_63




django缓存​

DRF学习笔记(2)_django_64


DRF学习笔记(2)_restframework_65


网友评论