drf大总结
接口
"""
1、什么是接口:url+请求参数+响应数据 | 接口文档
2、接口规范:
url:https,api,资源(名词复数),v1,get|post表示操作资源的方式,?过滤条件
响应数据:status,msg,results|data,url资源数据
"""
DRF入门
"""
1、封装风格
2、请求生命周期:走APIView的as_view => View的as_view调用APIView的dispatch => 分发给视图类的请求函数 => 响应
3、请求模块:二次封装request
4、解析模块:局部全局配置,form-data、urlencoding、json
5、渲染模块:局部全局配置,html、json
6、响应模块:Response(data, http_status, header)
data={'detail': serializer_obj.errors} => http_status=4..|5..
# 4,5开头字段状态码,前台axios请求响应会解析到catch分支
axios({}).then().catch()
7、二次封装Response:
i) 继承Response
ii) 自定义参数格式化成data,传给 super().__init__(data=data)
iii) 网络状态码、响应头等信息带给super().__init__()
8、异常模块:在请求生命周期中,分发请求任务执行时,被一个超大的try except包裹,一旦出现任何异常,都会交给exception_handler函数处理
自定义原因:系统只处理了部分,所以手动还需要处理;后期异常信息需要记录到日志文件
工作流程:先交给drf处理异常,如果有响应结果,代表drf已处理,如果是None,自己处理
"""
序列化组件
# 1)可以将model对象序列化成可以返回给前台的json数据
# 2)可以校验前台传来的数据,完成model的增与改
模型层
class User(models.Model):
name = models.CharField(max_length=16)
# 自定义插拔序列化字段 - 完成连表深度查询
@property
def my_name(self):
return self.name
序列化层
class UserListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
for index, obj in enumerate(instance):
self.child.update(obj, validated_data[index])
return instance
class UserModelSerializer(serializers.ModelSerializer):
# 自定义反序列化不入库字段 - 要在钩子函数校验后移除
check_name = serializers.CharFiled(write_only=True)
class Meta:
model = User
fields = ['name', 'my_name', 'check_name']
extra_kwargs = {
'my_name': {
'read_only': True
}
}
# 群改
list_serializer_class = UserListSerializer
# 局部、全局钩子
# create、update方法不需要重写,可以完成单增、群增、单改
视图层
class UserAPIView(APIView):
def get(self, request, *args, **kwargs):
# 先orm得到 user_query | user_obj
# 在得到序列化对象
user_ser = UserModelSerializer(user_query, many=True)
user_ser = UserModelSerializer(user_query, many=False)
# 返回序列化结果 user_ser.data
def post(self, request, *args, **kwargs):
# 数据给序列化类
user_ser = UserModelSerializer(data=user_list, many=True)
user_ser = UserModelSerializer(data=user_dic, many=False)
# 校验数据
user_ser.is_valid(raise_exception=True)
# 数据库操作
user_query|user_obj = user_ser.save()
def patch(self, request, *args, **kwargs):
# 根据主键或主键们确定要修改的 对象 或 对象们
# 数据给序列化类
user_ser = UserModelSerializer(data=user_list, many=True, instance=对象们, partial=True|False)
user_ser = UserModelSerializer(data=user_dic, many=False, instance=对象, partial=True|False)
# 校验数据
user_ser.is_valid(raise_exception=True)
# 数据库操作
user_query|user_obj = user_ser.save()
三大认证
"""
1、认证组件:
i)自定义认证类继承BaseAuthentication,重写authenticate方法
ii)规则:游客返回None,非法用户抛异常,合法用户返回(user, auth)
iii)全局局部配置
2、权限组件:
i)自定义权限类继承BasePermission,重写has_permission方法
ii)规则:有权限返回True,无权限返回False - 校验对象:request.user或请求方式
iii)全局局部配置
3、评论组件:
i)自定义频率类继承SimpleRateThrottle,重写get_cache_key方法,设置scope类属性
ii)全局配置scope对应的访问频率:次数/时间
iii)get_cache_key返回的是与限制条件有关的动态字符串 - 限制条件来源于请求参数或请求头
iv)全局局部配置
4、jwt认证:
i)客户端存token,服务器存签发算法、校验算法、秘钥
ii)基本信息(头base64).用户信息过期时间(载荷base64).全信息+秘钥(签名HS256)
iii)drf-jwt组件使用
iv)登录接口签发token
v)认证组件校验token
"""
群查过滤组件
"""
1、搜索组件:search_fields = ['name', 'price']
2、排序组件:ordering_fields = ['pk', 'price']
3、分页组件:pagination_class = pagenations.MyPageNumberPagination
4、django-filter过滤插件:filter_class = CarFilterSet
5、自定义过滤器:自定义过滤类实现filter_queryset即可,根据筛选条件筛选后再返回queryset即可
使用:
i)视图类添加过滤类:filter_backends = [SearchFilter, OrderingFilter, LimitFilter, DjangoFilterBackend]
ii)为不同的过滤类配置过滤条件
"""
drf大总结的更多相关文章
- 《JAVA语言程序设计》上课笔记
教学目标:1.使学生了解JAVA课程的性质.定位.作用:为什么要学习JAVA?让学生知道如何学好JAVA: 教学内容: 一. 问几个问题 1. 你们到这里来干什么 ...
- drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族
目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...
- DRF中两大视图基类APIView/GenericAPIView的介绍
(1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父类. APIView与V ...
- drf序列化大总结
目录 一.APIView的请求生命周期 二.序列化组件 视图类中使用序列化 Meta配置类中的配置 自定义校验规则 入库方法 自定义字段 如果有群改操作 重(难)点 三.视图家族 四.路由组件 五.权 ...
- django drf 10大请求序列化方法
## 整体单改 路由层.模型层.序列化层不需要做修改,只需要处理视图层:views.py ```python"""1) 单整体改,说明前台要提供修改的数据,那么数据就需要 ...
- 深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台
深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台 大家好,欢迎大家参加这次DC/OS的技术分享. 先做个自我介绍,刘超,Linker Networks首席架构师,Open DC/OS社区 ...
- DRF缓存
对于现在的动态网站来讲,所有的界面展示都是通过客户端请求服务端,服务端再去请求数据库,然后将请求到的数据渲染后返回给客户端.用户每次访问页面都需要去请求数据库,如果同时有多个人访问的话,对于我们的数据 ...
- drf相关问题
drf自定义用户认证: 登录默认 使用django的ModelBackend,对用户名和密码进行验证.但我们平时登录网站时除了用户名也可以用邮箱或手机进行登录,这就需要我们自己扩展backend 一. ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
随机推荐
- CodeForces - 651C Watchmen (去重)
Watchmen are in a danger and Doctor Manhattan together with his friend Daniel Dreiberg should warn t ...
- CSS基础之浮动属性float图文详解
宏观地讲,我们的web页面的制作,是个“流”,必须从上而下,像“织毛衣”. 标准流里面的限制非常多,导致很多页面效果无法实现.如果我们现在就要并排.并且就要设置宽高,那该怎么办呢?办法是:超脱 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- Shell脚本查询磁盘数量
之前帮朋友写的脚本,运维大数据服务器时候用的. #!/bin/bash ##磁盘数量 Disk=$( fdisk -l |grep 'Disk' |grep 'sd' |awk -F , '{prin ...
- StreamPipes
MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was desi ...
- Java必须知道的知识点
junit用法,before,beforeClass,after, afterClass的执行顺序 分布式锁 nginx的请求转发算法,如何配置根据权重转发 用hashmap实现redis有什么问题( ...
- 简述python(threading)多线程
一.概述 import threading 调用 t1 = threading.Thread(target=function , args=(,)) Thread类的实例方法 # join():在子线 ...
- python中一行字符串太多写不下时怎么写
‘123456789‘ 见此博客 https://www.cnblogs.com/wanderingzj/p/5244451.html str1=('123 '455' '789') 这样的话, ...
- Python获取最新电影的信息
这次将从电影天堂获取最新的电影的详细信息,这里电影的信息罗列的比较详细. 本来只是想获取电影的迅雷链接,然后用迅雷去下载.但看到这里的电影的信息比较完整和详细,忍不住把所有信息都爬取下来了. 下图是& ...
- oracle分组并在组内排序
根据c1,c2分组,并且根据c3排序,取第一行select tt.* from (select row_number() over(partition by c1, c2 order by c3 d ...