DRF之请求与响应

目录

一、模块与包回顾

二、反序列化校验源码分析(了解)

三、断言

四、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_exception=False):# 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, data=empty):# 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(detail=as_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: # 序列化类中所有字段类的对象 name=CharField()# 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
# JSONParser:json
# FormParser:urlencoded
# MultiPartParser:form-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】源码

data=None  # 咱们给的字典或列表或字符串---> 最终放到了http响应体中返回了status=None # http响应状态码,默认是200,你可以改,改成from rest_framework import status 状态码 
"http响应状态码分别代表啥意思:200成功   201创建成功"template_name=None:用浏览器访问好看的页面--> 指定的--> 默认使用drf提供的--> 后期可以自己写页面,使用 
headers=None, # 响应头
content_type=None # 响应编码格式"""我们需要记住的
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内置的(两个都支持)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 常用注解,Android 开发小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具。里面包含了 Android 开发中常用的代码检测注解,帮助开发者提高代码质量。通过 SDK Manager下载 Android Support Repository 后,在 Gradle 中通过如下声明…

codeforces B. Friends and Presents(二分+容斥)

题意:从1....v这些数中找到c1个数不能被x整除,c2个数不能被y整除! 并且这c1个数和这c2个数没有相同的!给定c1, c2, x, y, 求最小的v的值! 思路: 二分容斥,二分找到v的值,…

android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述

音量控制键控制的音频流(setVolumeControlStream)描述2021-01-03 16:18Android教程网 Android当开发多媒体应用或者游戏应用的时候,需要使用音量控制键来设置程序的音量大小,在Android系统中有多种音频流,感兴趣的朋友可以了解下当开发多媒体应用或者游戏应用的时候…

eclipse的使用

eclipse如何打开一个已存在的工程!先给eclipse创建一个workspace,这个workspace就是一个文件夹用来管理eclipse项目的,或者修改eclipse的workspace,选择菜单file->switch workspace->other,选择一个已经存在的workspace。将已经存在的项目导入到wo…

Android延伸布局到状态栏,Android 状态栏透明

前言:最近项目大量用到状态栏透明,网上也出现很多库可以直接拿来用,个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法),所以研究了一番,在此做个记录加强记忆也便后期查阅,如果无意中有幸能…

glassfish服务器默认的网页所在的位置

http://localhost:8080/ 默认打开的网页所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 转载于:https://www.cnblogs.com/hujunzheng/p/4052920.html

华为HarmonyOS 鸿蒙,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布

据悉,本次手机开发者Beta测试支持以下中国境内主制式手机及平板电脑。手机:全网通(5G双卡)P40 、 全网通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G),型号清单为ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http协议客户端向服务器端请求时一般需要发送的内容

out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... out.println("Aceept: */*");//客户端能够处理的文件类型(不是必须&#xff…

android oneshot自动播放bug,移动端常见bug汇总001

前言本文是摘录整理了移动端常见的一些bug以及解决方案,第一篇,后面还会有持续的文章更新整理。点击样式闪动Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 与 Integer.class

TYPE 表示的引用类型所对应的基本类型的Class对象! 转载于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber启动动画,模仿Uber的启动画面(上)

启动画面(Splash Screen)——不但给开发者们提供了一个尽情发挥、创建有趣动画的机会,也填补了App启动时从终端慢吞吞地下载数据的时间。启动画面(动态的)对于App至关重要:它可以让用户不失兴趣地耐心等待应用完成加载。尽管现在的启动画面多种多样&…

java中产生对象的两种方式

/** 普通new对象的过程!*/Person pp new Person();System.out.println(pp);/** 利用代用参数的构造器产生对象实例!* 首先获得相应带参数的构造器,然后利用构造器产生对象实例!*/pclass Class.forName("get_class_method.P…

智慧屏用鸿蒙的生态,紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?...

原标题:紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?12 月 21 日,华为正式发布了两款智慧屏新品,智慧屏 S 系列和车载智慧屏,前者是智慧屏的新系列,后者则是新开辟的车机产品线。没有意外…

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常Field ageField pclass.getDeclaredField("age");//获得该对象反映此…

MySQL不能插入中文字符及中文字符乱码问题

MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8。在安装后MySQL之后,它的配置文件不是很给力,不知道你们的是不是,反正我的是! 开始插入中文字符的时候出现如下错…

android计算距离顶部的距离,(lua版)计算距离的逻辑是从Android的提供的接口(Location.distanceBetween)中拔来的,应该是最精确的方法了...

---coding by yuangu(lifulinghanaol.com)--用于计算2个pgs之间的距离function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…

codeforces C. Bits(数学题+或运算)

题意:给定一个区间,求区间中的一个数,这个数表示成二进制的时候,数字1的个数最多! 如果有多个这样的数字,输出最小的那个! 思路:对左区间的这个数lx的二进制 从右往左将0变成1&#…

密码与确认密码自动验证html,HTML确认密码

今天准备分享一个小知识点,就是确认登录界面输入户名: 输入密码: 确认密码: function validate() {var pw1 document.getElementById("pw1").value;var pw2 document.getElementById("pw2").value;if(pw1 …

实现单词大小写不敏感的正则表达式的匹配!

//实现单词大小写不敏感的正则表达式的匹配! //方法1: tmp "java java JavaJAVA"; px Pattern.compile("java", Pattern.CASE_INSENSITIVE); mx px.matcher(tmp); System.out.println(mx.replaceAll("JAVA")); //方法二…

r语言 发送邮件html,r语言读取数据的方法

R 对于基于 SQL 语言的关系型数据库有良好的支持,这些数据库既有商业数据库 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下发布的 MySQL 等开源数据库。RMySQL 包中提供了到 MySQL 数据库的接口;RO…