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

相关推荐
m0_748554815 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
smj2302_796826526 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
阿正呀7 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_901200537 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
_.Switch7 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
Mr_sst7 小时前
Claude Code 部署与使用保姆级教程(2026 最新)
python·ai
瞎某某Blinder7 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
m0_495496418 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume9 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
Aleeeeex9 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程