前后端开发模式:混合、分离
API接口:地址、请求方法、请求参数、返回值
测试软件的使用:postman、Apifox等
序列化和反序列化
restful规范:比如http响应状态码
在Django中写符合规范的接口
djangorestframework:django的app
快速使用
CBV源码分析
路由中,视图类.as_view() ----> django的View的as_view() ---->执行结果view内存地址---->请求来了,路由匹配成功---->view(request) ---->return self.dispatch() ----> View的dispatch ---->通过反射,不同的请求会执行视图类中跟请求同名的方法
APIview源码分析
APIView继承了View
视图类: class BookView(APIView):
路由中 ,视图类.as_view() ---->drf的APIView的as_view() ---->调用父类的as_view,去除csrf ---->
View类的as_view内部的view闭包函数(加了个装饰器) ---->view(request) ---->return self.dispatch() ---->APIView的dispatch()
request.data
request.query_params
request.Files
request.method,request.path等
重写了魔术方法()
能做的事:序列化、反序列化校验、序列化
Serializer ---->book表先做序列化
定义序列化类
class BookSerializer (Serializer):
name=serializer.CharField()
使用序列化类
ser=BookSerializer(instance=qs,单个对象,many=True)
ser.data #字典
字段类:很多,如ListField、DictField
字段参数:反序列化校验,字段自己的规则
read_only write_only
反序列化校验:1.字段自己 2.局部钩子:validate_字段名 3.全局钩子validate
反序列化保存:校验过后,ser.save() ---->判断instance是否存在,如果不存在,就是调用ser的create方法。在序列化类中,重写create
反序列化更新:校验过后,ser.save() ---->判断instance是否存在,如果不存在,就是调用ser的update方法。在序列化类中,重写update
ModelSerializer的使用:不需要写一个个字段,跟表模型有对应关系
extra_kwargs
其他跟Serializer一模一样
序列化,定制返回格式
source
SerializerMethodField:写在序列化类中,配合一个 get_字段名的方法,返回什么,前端就看到什么
在表模型中写:写方法,返回字典、列表、字符串 ---->在序列化类中可以使用ListField、DictField
Request类的对象
接收前端传入的编码格式:json,urlencoded,form-data
局部配置 全局配置
Request的源码
Response类的对象
前端看到的形式(浏览器,json)
源码分析:data headers status_code
两个视图基类:APIView,GenericAPIView
五个视图扩展类,必须配合GenericAPIView。基于它再封装成自己的5个视图扩展类,返回格式符合公司规范
九个视图子类:5个视图扩展类+GenericAPIView
视图集:ViewSetMixin:只要继承它,路由写法就变了
ViewSet:ViewSetMixin,views.APIView
GenericViewSet:ViewSetMixin,generics.GenericAPIView
ModelViewSet:
1.继承了ModelViewSet,没有增加一条记录,就干某个事,重写
perform_create
2.序列化使用一个序列化类,反序列化使用配置的那个序列化类
3.自定义了一个方法:login,使用了action装饰器,让它取到的qs对象和序列
化类跟配置的都不一样
ReadOnlyModelViewSet
视图类:self 内部有request对象,还有个action,就是视图类中方法的字符串名
认证:写个类,继承BaseAuthentication,重写authenticate方法,在里面做认证,如果认证通过返回两个值,如果认证失败,就抛异常 ---->局部、全局配置
权限:同上
频率:写个类,继承SimpleRateThrottle,重写get_cache_key,返回什么,就以什么做限制(ip,用户id) ---->类属性:scop ---->配置文件配置,全局和局部
使用内置的即可,查询所有接口,才有排序,必须继承GenericAPIView
在视图类中,配置filter_backends=[OrderingFilter],还需要配置属性:ordering_fields=[id,price]
如果是继承APIView写排序,自己写
内置:SearchFilter,模糊查询
第三方:django-filter
自己写的:写一个类,继承BaseFilterBackend,重写filter_queryset,返回qs对象,返回的就是过来后的
三种分页方式:PageNumberPagination,LimitOffsetPagination,CursorPagination
每个里有些类属性控制:每页显示多少条,最多显示多少条,第几页等
写个类,继承三个之一,配置在视图类上(必须继承GenericAPIView)
继承APIView写分页
全局异常处理 ---->同一返回格式
写个函数:custom_exception_handler(exc,context) ----> 调用了原来的exception_handler (只能处理drf的异常) ----> 返回两种情况:None,Response的对象
配置在drf的配置文件