手表设计网站,表白网页制作免费网站,西宁做网站哪家好,1688阿里巴巴官网首页目录
一、模块与包回顾
二、反序列化校验源码分析(了解)
三、断言
四、drf之请求
【1】源码分析
【2】配置视图类能处理的编码格式
五、drf之响应
【1】源码
【2】响应编码格式 一、模块与包回顾
模块与包 什么是模块#xff1f; 一个py文件#xff0c;被别的py文件…目录
一、模块与包回顾
二、反序列化校验源码分析(了解)
三、断言
四、drf之请求
【1】源码分析
【2】配置视图类能处理的编码格式
五、drf之响应
【1】源码
【2】响应编码格式 一、模块与包回顾
模块与包 什么是模块 一个py文件被别的py文件导入使用它就是模块如果py文件直接右键运行它叫脚本文件什么是包 一个文件夹下有 __init__.py 和很多py文件这个就是包
导入模块或包使用的规则
0 导入模块有相对导入和绝对导入绝对的路径是从环境变量开始的1 导入任何模块如果使用绝对导入都是从环境变量开始导入起 import xx #### xx所在路径必须在环境变量from yy import ####yy所在路径必须在环境变量中2 脚本文件执行的路径会自动加入环境变量3 相对导入的话是从当前py文件开始计算的4 以脚本运行的文件不能使用相对导入只能用绝对导入5 pycharm 会把项目根路径加入到环境变量--- 离开pycharm就不行了6 我们看到第三方包都是绝对导入form 它自己的包名 import xx下载的第三方包都在site-package中而site-package一定在环境变量中二、反序列化校验源码分析(了解)
1 执行 ser.is_valid() 就会执行 反序列化的校验 ---字段自己 -- 局部钩子 --- 全局钩子
2 入口是ser.is_valid() --- BaseSerializer 找到了 1 自己写的BookSerializer --- serializer.Serializer ---- BaseSerializer 2 源码如下
def is_valid(self, *, raise_exceptionFalse):# self 是 ser对象---》自己写的BookSerializer的对象--》一开始没有# 一旦有了就不执行了优化is_valid被多次调用只会走一次校验if not hasattr(self, _validated_data):try:# 一旦执行过以后self中就有_validated_data# 接下来看self.run_validation(self.initial_data)self._validated_data self.run_validation(self.initial_data)except ValidationError as exc:self._validated_data {}self._errors exc.detailelse:self._errors {}if self._errors and raise_exception:raise ValidationError(self.errors)return not bool(self._errors) 3 self.run_validation(self.initial_data) --- serializer.Serializer类的不要按住ctrl点击否则会进 Field 类看错了 4 serializer.Serializer类的run_validation
def run_validation(self, dataempty):# data前端传入的--{name:张三,age:68}# value是---》前端传入的字段自己校验通过的字典---{name:张三,age:68}value self.to_internal_value(data) # 执行局部钩子try:self.run_validators(value) # 先不看忽略掉# self 是 BookSerializer的对象如果我们写了全局钩子走我们自己的如果没写走父类的父类 的根本没做校验# value{name:张三,age:68}value self.validate(value)# 执行全局钩子except (ValidationError, DjangoValidationError) as exc:raise ValidationError(detailas_serializer_error(exc))return value 5 全局钩子读完了self 是 BookSerializer的对象如果我们写了全局钩子走我们自己的如果没写走父类的父类的根本没做校验 6 局部钩子value self.to_internal_value(data)--》Serializer类的 for循环着去BookSerializer的对象中反射 validate_字段名的方法如果有就执行没有就不执行
def to_internal_value(self, data):for field in fields: # 序列化类中所有字段类的对象 nameCharField()# self 是BookSerializer类的对象# 去BookSerializer类中反射 validate_field字段类的对象.field_namevalidate_method getattr(self, validate_ field.field_name, None)try:# 如果能拿到说明咱么写了局部钩子if validate_method is not None:# 执行局部钩子--》传入了当前字段的value值validated_value validate_method(validated_value)except ValidationError as exc:# 如果抛异常会被捕获errors[field.field_name] exc.detailexcept DjangoValidationError as exc:errors[field.field_name] get_error_detail(exc)except SkipField:passelse:set_value(ret, field.source_attrs, validated_value)if errors:raise ValidationError(errors)return ret
##### 读了局部和全局钩子的执行位置 #####
保存修改也好都要用validated_data它是最准确的
三、断言
a 10# assert 后写条件只要不符合条件就会抛AssertionError异常后面写异常信息
assert a 11, (不等于11报错了)# 等同于---上面只要一行代码源码中喜欢用
if not a 11:raise Exception(不等于11报错了)# 源码中使用
assert value is not None, .validate() should return the validated data
四、drf之请求
# Request 类的对象
from rest_framework.request import Request
【1】源码分析
1 新的request
2 request.data 前端传入的请求体中得数据无论那种编码
3 用起来跟之前一样
4 老的request在request._request
【2】配置视图类能处理的编码格式
# 默认视图类的方法可以处理任意编码格式-urlencoded-form-data-json# 比如有的接口只能接收json格式其他格式都不能处理# 配置方式一视图类上配置
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
# JSONParserjson
# FormParserurlencoded
# MultiPartParserform-data
class TestView(APIView):# parser_classes [JSONParser]parser_classes [JSONParser,FormParser]def post(self, request):print(request.data)return Response(ok)
# 配置方式二settings.py 配置文件中配置## 所有drf的配置都要写在REST_FRAMEWORK字典中 ##REST_FRAMEWORK {DEFAULT_PARSER_CLASSES: [# rest_framework.parsers.JSONParser,# rest_framework.parsers.FormParser,rest_framework.parsers.MultiPartParser,],}# 全局使用某种单某个视图类局部使用--- 优先用视图类配置的--- 视图类没配置-- 项目配置文件 --- 项目配置文件如果没配置--- drf配置文件默认三个都支持-配置文件正常写class TestView(APIView):parser_classes [JSONParser,FormParser]# 一般我们做--- 只支持json
# 对于上传的文件的接口---》单独配置 只允许 form-data
五、drf之响应
from rest_framework.response import Response
【1】源码
dataNone # 咱们给的字典或列表或字符串--- 最终放到了http响应体中返回了statusNone # http响应状态码默认是200你可以改改成from rest_framework import status 状态码
http响应状态码分别代表啥意思200成功 201创建成功template_nameNone用浏览器访问好看的页面-- 指定的-- 默认使用drf提供的-- 后期可以自己写页面使用
headersNone, # 响应头
content_typeNone # 响应编码格式我们需要记住的
data
status
headers【2】响应编码格式
# 配置方式跟请求解析类似# 方式一在视图类上配置
class TestView(APIView):renderer_classes [JSONRenderer,BrowsableAPIRenderer]# 方式二配置文件中配置
REST_FRAMEWORK {DEFAULT_RENDERER_CLASSES: [rest_framework.renderers.JSONRenderer,rest_framework.renderers.BrowsableAPIRenderer,],}# 优先用 视图类的--- 项目配置文件--- drf内置的两个都支持