[drf]源码和序列化梳理
2024-09-05 03:39:22
drf源码继承管理
# drf继承关系
View
APIView
as_view:
执行父类的as_view
调用dispatch
dispatch
init_request
request.queryparams
request.Data
init
内容协商/版本
认证/授权/限流
GenericAPIView
get_queryset
get_serializerclass
过滤/分页
viewset
重写as_view方法
# drf和orm耦合度太高? 可以继承viewsets.ViewSet类.逃脱了gennericapiview
class ViewSet(ViewSetMixin, views.APIView):pass
class GetTaskIpLogViewSet(viewsets.ViewSet):
def list(self, request, *args, **kwargs):
data = get_task_ip_log("cat /etc/hosts")
return Response(data)
序列化器
//序列化api: 后端 -> 浏览器
serializer = CommentSerializer(comment) # 对象/queryset -> dict
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
from rest_framework.renderers import JSONRenderer
json = JSONRenderer().render(serializer.data) # 多个对象many=true
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'
//反序列化api: 浏览器 -> 后端
# 准备字节流
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
stream = BytesIO(json)
data = JSONParser().parse(stream)
serializer = CommentSerializer(data=data) # 多个对象many=true
serializer.is_valid()
# True
serializer.validated_data
serializer.errors
// 校验post参数的合法性
# 还可以自定义复杂的验证器 1.基于字段 2.基于对象 3.全局定义验证器
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
from rest_framework import viewsets
class UserViewset(viewsets.ViewSet):
def list(self, request, *args, **kwargs):
return Response("hello")
def create(self, request, *args, **kwargs):
serializer = CommentSerializer(data=request.data, many=True)
if serializer.is_valid(raise_exception=True): # 抛出404.默认不写是200
return Response(serializer.validated_data)
else:
return Response(serializer.errors)
序列化通用参数
最新文章
- 页面制作部分之PS切图
- wait、notify、sleep、interrupt对比分析
- 一起来做chrome扩展《AJAX请求》
- c++ 对象的内存布局
- IE6、7绝对定位层被遮挡的原因(主要是父层决定的)
- Mysql 导入数据,推荐Source命令,太快了
- HDU5934 Bomb(2016杭州CCPC第二题)(强连通缩点)
- BNUOJ 1006 Primary Arithmetic
- (KEIL)MDK5安装与JLINK问题解决方法(支持代码自动补全)
- head first c&;lt;11&;gt;初探网络编程上
- 运行PHP
- Centos 7.3 安装mysql5.7.19 各种调试就不多说了
- 树莓派.使用Node.js控制GPIO
- 在java程序中实现发送邮件的功能
- Mockito框架入门教程(二)
- asp.netajax与jquery和bootstrap的无刷新完美实现
- X86给龙芯笔记本编译本地工具链(未完待续)
- List 的add()与addAll()的区别
- Lazarus分体式改成一体式窗口
- FreeMarker快速入门
热门文章
- 4.解析配置文件 redis.conf
- 【Hibernate】Hibernate关联关系的映射
- Django应用之content type(app应用之一django.contrib.contenttypes)
- Image Processing and Analysis_8_Edge Detection:Statistical edge detection_ learning and evaluating edge cues——2003
- 网络流dinic ek模板 poj1273
- linux命令详解——eval
- watch 监控的新旧值一致问题处理
- c#调用
- BZOJ 2229 / Luogu P3329 [ZJOI2011]最小割 (分治最小割板题)
- shiro框架的UsernamePasswordToken与对应Realm中的AuthenticationToken的一点比较(转)