DjangoRestFramework概括

一 drf入门规范

前后端开发模式:混合、分离

API接口:地址、请求方法、请求参数、返回值

测试软件的使用:postman、Apifox等

序列化和反序列化

restful规范:比如http响应状态码

在Django中写符合规范的接口

djangorestframework:django的app

快速使用

二 CBV源码分析

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类的对象

request.data

request.query_params

request.Files

request.method,request.path等

重写了魔术方法()

四 序列化组件(drf核心)

能做的事:序列化、反序列化校验、序列化

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的配置文件

相关推荐
cm65432027 分钟前
用Python破解简单的替换密码
jvm·数据库·python
wan9yu44 分钟前
为什么你需要给 LLM 的数据"加密"而不是"脱敏"?我写了一个开源工具
python
摇滚侠1 小时前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
这个名有人用不1 小时前
解决 uv 虚拟环境使用 pip 命令提示command not found的办法
python·pip·uv·claude code
Oueii2 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
2501_908329852 小时前
使用Python自动收发邮件
jvm·数据库·python
2501_908329852 小时前
NumPy入门:高性能科学计算的基础
jvm·数据库·python
2401_874732533 小时前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
平常心cyk3 小时前
Python基础快速复习——集合和字典
开发语言·数据结构·python