品牌网站搭建,承德优化网站建设,软件开发工程师绩效考核指标,网页设计怎样做一个网页文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验#xff0c;校验顺序为#xff1a;先校验字段… 文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验校验顺序为先校验字段自己的规则(最大、最小)然后是局部钩子然后是全局钩子 反序列化校验开始 在视图类中的s_valid()被执行时就会进行反序列化的校验校验通过返回True否则返回False 反序列化的过程 ser.is_valid()是序列化类的对象假设序列化类是BookSerializer当执行is_valid时。首先在序列化类产生的对象中查找当找不到就会去找到它的父类中找结果在它父类的父类中找到了BaseSerializer BaseSerializer类def is_valid(self, *, raise_exceptionFalse):断言检查确保类的实例中具有名为initial_data的属性如果没有就引发下面这段话包含的特定的错误信息assert hasattr(self, initial_data), (Cannot call .is_valid() as no data keyword argument was passed when instantiating the serializer instance.)if not hasattr(self, _validated_data):self序列化类的对象属性中没有_validated_data就一定会走这句并且只要走过一次后下一次就无需再次走了它优化了is_valid被多次调用只会走一次校验try:真正的走校验一旦执行了这里以后self中就有了_validated_data然后我们就得去看看这个self.run_validation(self.initial_data)我们不能直接按住ctrl键点击因为它会从当前类中找run_validation我们得清楚这个self是谁它还是我们的视图类所以我们得返回到视图类从它一步一步往它继承的类中找清楚如何查找后我们就从视图类----》serializer.Serializer(找到了为什么从这个里面找因为我们就是使用serializer.Serializer类的)self._validated_data self.run_validation(self.initial_data)这下面的是当校验不通过时执行的会给_validatad_data设置为一个空字段并且给_errors设置为验证错误的详细信息except ValidationError as exc:self._validated_data {}self._errors exc.detailelse:self._errors {}return not bool(self._errors)通过上面self.run_validation(self.initial_data)我们找到了下面这块源码而这里的run_validatiion方法就是DRF序列化器验证过程中的核心def run_validation(self, dataempty):局部钩子的执行,这里的self就还是视图类的对象data就是前端传入的数据value是前端传入字段自己校验通过的字典value self.to_internal_value(data)try:这个是字段验证器self.run_validators(value)这个是全局钩子的执行和上面一样self是视图类的对象如果我们在序列化其中写了全局钩子那么就优先使用我们自己定义的全局钩子如果没写则执行父类的(serializer.Serializer)结果可以看到父类根本就没有做校验def validate(self, attrs):return attrsvalue self.validate(value) #运行自定义验证方法确保自定义验证方法返回了验证后的数据assert value is not None, .validate() should return the validated dataexcept (ValidationError, DjangoValidationError) as exc:# 捕获验证过程中可能引发的异常并转换为DRF的ValidationErrorraise ValidationError(detailas_serializer_error(exc))# 返回验证后的数据return value看完了全局钩子后我们在看一下局部钩子的self.to_internal_value(data)也是一样的思路从视图类找视图类肯定没有然后找父类serializer结果就是这个页面的def to_internal_value(self, data):ret OrderedDict()# 用于存储验证后的数据errors OrderedDict()# 用于存储字段验证过程中的错误信息fields self._writable_fields# 获取序列化器中的所有字段序列化类中所有的字段for循环每次取一个字段对象。例如nameCharField()for field in fields: 去视图类的对象中反射validate_字段名的方法如果有就执行没有就不执行validate_method getattr(self, validate_ field.field_name, None)primitive_value field.get_value(data)try:这句话就是字段自己的校验规则(最长最短长度等)validated_value field.run_validation(primitive_value)局部钩子如果在序列化类中写了局部钩子验证规则就运行自己写的if validate_method is not None:执行局部钩子传入当前字段的value值validated_value validate_method(validated_value)如果抛异常了就会被捕获except ValidationError as exc:捕获DRF的ValidationError异常errors[field.field_name] exc.detailexcept DjangoValidationError as exc:捕获Django的ValidationError异常errors[field.field_name] get_error_detail(exc)except SkipField:如果遇到SkipField异常就跳过该字段的处理passelse:如果没有异常将验证后的值设置到结果中set_value(ret, field.source_attrs, validated_value)if errors:raise ValidationError(errors)return ret这里提一下如何追源码查看下面两张图即可。 二、断言Assert 普通写法name jack1if not name jack:raise Exception(name不登录jack)断言写法assert 后写条件只要不符合条件就会跑AssertionErro异常后面写异常信息name tomassert name tom,name不是tomprint(程序执行完毕)源码中使用assert value is not None, .validate() should return the validated data三、DRF之请求、响应
Request类和Response类
Request类 REST FrameWork传入视图的Request对象不再是Django默认的HttpRequest对象 而是REST FrameWork提供的扩展了HttpResponse类的Request类的对象了 Rest FrameWork提供了Parser解析器 在接收到请求后自动根据Content-type指明的数据类型默认是JSON 将请求数据进行Parse解析 解析为字典[QueryDict]对象保存到Request对象中 Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果 无论前端发送的哪种格式数据 我们都可以用同一个一种方式读取数据 属性data request.data返回解析之后的请求题数据 类似于Django中的request.POST和request.FILES属性
包含了解析之后的文件和非文件数据包含了对POST、PUT、PATCH请求方式解析后的数据利用了REST FrameWork的Parsers解析器 不仅仅支持表单类型数据 也支持JSON数据
属性query_params request.query_params与Django标准的request.GET相同 只是更换了更正确的名称 Response类 Response(dataNone, statusNone,template_nameNone, headersNone,exceptionFalse, content_typeNone)REST FrameFork提供了一个响应类Response使用该类构造响应对象时 响应的具体数据内容会被转换(render渲染)成符合前端需求的类型 REST FrameFork提供了Renderer渲染器 用来根据请求投中的Accept接收数据类型声明 来自动转换响应数据到对应格式 如果前端请求中未进行Accept声明 则会采用默认方式处理响应数据 我们可以通过配置来修改默认响应格式 可以在rest_framework.settings查找所有的drf默认配置项 REST_FRAMEWORK {DEFAULT_RENDERER_CLASSES: ( # 默认响应渲染类rest_framework.renderers.JSONRenderer, # JSON渲染器rest_framework.renderers.BrowsableAPIRenderer, # 浏览器API渲染器)}参数说明
data 为响应准备的序列化处理后的数据status 状态码默认200template_name 模版名称 如果使用HTML Renderer时需要指定headers 用于存放响应头信息的字典content_type 响应数据的Content_type 通常此参数无需传递 REST FrameWork会根据前端所需类型数据来设置该参数
常用属性
data 传给response对象的序列化后 但还没有给render处理的数据status_code 状态码数字content 经过render处理后的响应数据
状态码 为了方便设置状态码REST framewrok在rest_framework.status模块中提供了常用状态码常量。 1信息告知 - 1xx HTTP_100_CONTINUEHTTP_101_SWITCHING_PROTOCOLS2成功 - 2xx HTTP_200_OKHTTP_201_CREATEDHTTP_202_ACCEPTEDHTTP_203_NON_AUTHORITATIVE_INFORMATIONHTTP_204_NO_CONTENTHTTP_205_RESET_CONTENTHTTP_206_PARTIAL_CONTENTHTTP_207_MULTI_STATUS3重定向 - 3xx HTTP_300_MULTIPLE_CHOICESHTTP_301_MOVED_PERMANENTLYHTTP_302_FOUNDHTTP_303_SEE_OTHERHTTP_304_NOT_MODIFIEDHTTP_305_USE_PROXYHTTP_306_RESERVEDHTTP_307_TEMPORARY_REDIRECT4客户端错误 - 4xx HTTP_400_BAD_REQUESTHTTP_401_UNAUTHORIZEDHTTP_402_PAYMENT_REQUIREDHTTP_403_FORBIDDENHTTP_404_NOT_FOUNDHTTP_405_METHOD_NOT_ALLOWEDHTTP_406_NOT_ACCEPTABLEHTTP_407_PROXY_AUTHENTICATION_REQUIREDHTTP_408_REQUEST_TIMEOUTHTTP_409_CONFLICTHTTP_410_GONEHTTP_411_LENGTH_REQUIREDHTTP_412_PRECONDITION_FAILEDHTTP_413_REQUEST_ENTITY_TOO_LARGEHTTP_414_REQUEST_URI_TOO_LONGHTTP_415_UNSUPPORTED_MEDIA_TYPEHTTP_416_REQUESTED_RANGE_NOT_SATISFIABLEHTTP_417_EXPECTATION_FAILEDHTTP_422_UNPROCESSABLE_ENTITYHTTP_423_LOCKEDHTTP_424_FAILED_DEPENDENCYHTTP_428_PRECONDITION_REQUIREDHTTP_429_TOO_MANY_REQUESTSHTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGEHTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS5服务器错误 - 5xx HTTP_500_INTERNAL_SERVER_ERRORHTTP_501_NOT_IMPLEMENTEDHTTP_502_BAD_GATEWAYHTTP_503_SERVICE_UNAVAILABLEHTTP_504_GATEWAY_TIMEOUTHTTP_505_HTTP_VERSION_NOT_SUPPORTEDHTTP_507_INSUFFICIENT_STORAGEHTTP_511_NETWORK_AUTHENTICATION_REQUIRED请求中的Request 能够解析前端传入的编码格式
方式一 局部配置 在继承APIView及其子类的的视图类中配置 from rest_framework.parsers import JSONParser,FormParser,MultiPartParserclass BookView(APIView):parser_classes [JSONParser,]方式二全局配置 在配置文件中配置影响所有全局配置
django项目有默认配置每个项目有独立的一个配置文件 from django.conf import settingsfrom djangoday01 import settingsdrf有默认配置每个项目有独立的一个配置文件----django的配置文件中 from rest_framework import settingsfrom drf_day05 import settingsREST_FRAMEWORK {DEFAULT_PARSER_CLASSES: [rest_framework.parsers.JSONParser, # 默认json默认rest_framework.parsers.FormParser, # 默认urlencoded编码rest_framework.parsers.MultiPartParser, # 默认form_data编码],}方式三 如果全局配了1个某个视图类想要3个如何配置 全局配置不用动只需要在视图类中配置能够解析前端数据的3种编码格式视图类中查询的顺序视图类自身——项目drf配置——drf默认配置 响应中的Response能够响应的编码格式
方式一 在视图类中写-----局部配置 # 响应格式from rest_framework.renderers import JSONRenderer,BrowsableAPIRendererclass BookView(APIView):renderer_classes[JSONRenderer,]方式二 在项目配置文件中写—全局配置 REST_FRAMEWORK {DEFAULT_RENDERER_CLASSES: [rest_framework.renderers.JSONRenderer,rest_framework.renderers.BrowsableAPIRenderer,],}方式三 使用顺序一般就用内置的即可。使用顺序视图类自身配置——项目drf配置——drf默认内置的配置