序列化与反序列化、def的介绍与快速使用、cbv源码分析、APIView与request对象分析
今日内容概要
- 序列化与反序列化
 - def介绍和快速使用
 - cbv源码流程分析
 - drf之APIView和Request对象分析
 
内容详细
1、序列化和反序列化
# api接口开发
	最核心最常见的一个过程就是序列化
	所谓序列化就是把数据转换格式,序列化可以分两个阶段
	# 序列化:把我们语言识别的数据转换成指定的格式提供给别人:
		字典,列表,对象------》json/xml/prop,massagepack--->提供给别人(前端或其他服务)
	# 反序列化:把别人提供的数据转换/还原成我们需要的格式
我们在django中获取到的数据默认是模型对象(qs对象),但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人----》序列化过程
前端传入到后台的数据---》json格式字符串---》后端存到数据库中,需要转成python中的对象---》把json格式字符串转成python对象存到数据库的过程称为----》反序列化
2、drf介绍和快速使用
# 原生django,不使用任何其他模块,也可以写出符合resful规范的接口---》写起来麻烦一些
# 以查询所有图书为例:
	地址:127.0.0.1:8080/books
	路由:path('/books',views.books)  # django 2.x
	视图函数中:通过orm查出所有图书(qs)--->序列化(for循环自己拼成列表套字典[{name:西游记,price:99},{name:红楼梦,price:99}])---->JsonResponse返回给前端
# drf是django的一个app--》帮助咱们快速在django上写符合restful规范的接口
# 安装:
	pip3 install djangorestframework
	注意:django版本最新 4.x     一般用升级到3.x 或者 2.x
	drf的最新版本最低支持django 3.x以上---》出一个小问题---》装django 2.x---》当你pip3 install的时候,由于低于2.2不支持最新的drf---》把你老版本的django卸载---》给你装上最新版---》原来写的django项目可能有问题,运行不了
	django2.2以下--->drf降版本
	django3.x---->drf使用最新
# 官方说明版本问题:
	Python (3.6, 3.7, 3.8, 3.9, 3.10)
	Django (2.2, 3.0, 3.1, 3.2, 4.0)
# 此后演示 以django 2.2 djangorestframework 最新版为例

2.1、快速使用
# 针对于一个表,需要写那些接口---》5个
	以后看到的所有接口都是这5个的变形:
	使用postman测试:
		-查询所有---》get 请求->http://127.0.0.1:8000/books/
		-查询一个---》get 请求->http://127.0.0.1:8000/books/2/
		-新增一个---》post 请求->http://127.0.0.1:8000/books/ body中带数据
		-修改-----》put 请求:修改单个字段或者多个字段,patch 请求:只修改某个字段--->实际编码中,基本都用put
			http://127.0.0.1:8000/books/1/ body体中传入修改的数据
		-删除一个---》delete-->http://127.0.0.1:8000/books/1/
# 登陆接口---》本质其实是查询一个
# 注册接口----》本质是新增一个
# postman测试,地址要严格,斜杠有和没有是有区别的


视图 views.py
# 写5个接口---》配5个视图函数
# 使用drf来写-->使用视图类
from rest_framework.viewsets import ModelViewSet
from .models import Book  # 模块导入使用相对导入
# from app01.models import Book # 使用绝对导入
from .serializer import BookSerializer
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
路由 urls.py
from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from app01 import views
router = SimpleRouter()
router.register('books', views.BookView, 'books')
urlpatterns = [
    path('admin/', admin.site.urls),
]
urlpatterns += router.urls
序列化类 在app01下创建serializer.py文件
from .models import Book
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
模型 models.py
from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(decimal_places=2, max_digits=5)
    author = models.CharField(max_length=32)
3、cbv源码流程分析
# cbv路由写法:
	path('test/', views.TestView.as_view())
"""
第二个参数是函数内存地址 views.TestView.as_view()
as_view()执行完,也是一个内存地址>>>闭包函数view的内存地址
	当请求来了,路由匹配成功
	执行view(request) 传入当次请求的request对象
执行view(request) 本质上就是:
	return self.dispatch(request, *args, **kwargs)
	去View类中找 dispatch
		如果是get请求就会执行视图类中的get方法
		如果是post请求,就会执行视图类的post方法
"""
# as_view 是类的绑定方法
	View类的方法--》@classonlymethod
# dispatch核心代码
	handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
	return handler(request, *args, **kwargs)
"""
getattr反射
	从当前对象(视图类的对象)---》如果是get请求--》会拿到get方法
handler就是get方法
	handler(request)本质就是---》get(request)
"""
# 可以通过描述符自己写装饰器来装饰类(了解)
	完成类似于property,classmethod...
4、drf之APIView和Request对象分析
from django.views.generic.base import View  # 按照最真实的路径导入
from django.views.generic import View  # 因为在generic包的init里注册了
from django.views import View  # views包的init里注册了 generic.base
# APIView的执行流程
路由:path('order/', views.OrderView.as_view())
	第二个参数是函数内存地址
	APIView的as_view的执行结果:
		本质还是用了View类的as_view内的view闭包函数,去掉了csrf认证
	当请求来了 触发view闭包函数执行,并且传入request 调用了 self.dispatch:
		self是视图类的对象,从OrderView中找dispatch,但是找不到 父类APIView中有 本质上执行的dispatch是APIView
# APIView的as_view方法
	view = super().as_view(**initkwargs)  # 调用 APIView的父类(View)的as_view方法
	return csrf_exempt(view)  # 去掉csrf_exempt的认证,以后只要继承了APIView后,csrf就无效了,无论中间件是否注释掉
# APIView的dispatch
	def dispatch(self, request, *args, **kwargs):
		# request是新的drf提供的request,它是由老的django的request得到的
		# 通过老request,生成一个新request,drf的Request的对象
		request = self.initialize_request(request, *args, **kwargs)
		# 把新的request,放到了视图类对象中
		self.request = request
		try:
			# 执行了三大认证(认证,权限,频率)
			self.initial(request, *args, **kwargs)
			# self.http_method_names是个列表
			if request.method.lower() in self.http_method_names:
				# 原来dispatch的核心代码
				handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
		else:
			handler = self.http_method_not_allowed
			# 原来dispatch写的,但是request已经不是老request了,是新的
			response = handler(request, *args, **kwargs) # 执行视图函数的方法
		except Exception as exc:
			# 无论在三大认证过程中还是执行视图函数方法过程中,只要抛了异常,都会被捕获到
			# 处理全局异常
			response = self.handle_exception(exc)
		self.response = self.finalize_response(request, response, *args, **kwargs)
		return self.response
# APIView执行流程概述
	1 包装了新的Request对象,以后视图类中的方法中传入的request对象都是新的
	2 在进入视图函数之前,执行了三大认证
	3 无论三大认证还是视图函数的方法,执行过程中出了异常,都会被处理掉
#  如何包装的新的request
request = self.initialize_request(request, *args, **kwargs)
APIView的initialize_request 核心代码:
from rest_framework.request import Request
return Request(
		request,  # 老的request
		parsers=self.get_parsers(),
		authenticators=self.get_authenticators(),
		negotiator=self.get_content_negotiator(),
		parser_context=parser_context
	)
	新的Request中:self._request = request
	新的request._request是老的request
	新的:<class 'rest_framework.request.Request'>
	老的:<class 'django.core.handlers.wsgi.WSGIRequest'>
# 三大认证是如何走的
	self.initial(request, *args, **kwargs)
	APIView的核心代码:
		self.perform_authentication(request)  # 认证
		self.check_permissions(request)  # 权限
		self.check_throttles(request)  # 频率
# APIView的as_view方法
	view = super().as_view(**initkwargs)  # 调用APIView的父类(View)的as_view方法
	return csrf_exempt(view)  # 去掉csrf_exempt的认证,以后只要继承了APIView后,csrf就无效了,无论中间件是否注释掉
# crsf的局部禁用
	在视图函数上加装饰器 csrf_exempt装饰器 装饰器本质就是一个函数
	@csrf_exempt  # 装饰器的@ 是一个语法糖(特殊语法) 意为:把下面的函数当参数传入装饰器中并且把返回结果赋值给函数名:
		index=csrf_exempt(index)
		def index(request)
			pass
		上面跟 csrf_exempt(index) 一毛一样
Request对象分析
# rest_framework.request.Request -->常用属性和方法
# request.data
	前端post请求传入的数据 在老的request.POST请求下 老的只能处理urlencoded和formdata编码格式,json格式不能处理
	无论前端用什么编码post提交的数据,都从data中获取
# request.files  # 上传的文件对象
	以后直接使用新的request.method  request.path 拿到的就是老的 request.method...
	对象.调用属性或方法会触发 魔法方法 __getattr__
	原因在于新的request类重写了__getattr__, 以后新的request.method用的时候本质就是request._request.method
	def __getattr__(self, attr):
		try:
			return getattr(self._request, attr)  # 通过反射去老的里面取
		except AttributeError:
			return self.__getattribute__(attr)
# 总结:
	新的request当老的用即可,只是多了个data前端post请求传入的数据,三种编码格式都可以

序列化与反序列化、def的介绍与快速使用、cbv源码分析、APIView与request对象分析的更多相关文章
- 基于.NetCore的Redis5.0.3(最新版)快速入门、源码解析、集群搭建与SDK使用【原创】
		
1.[基础]redis能带给我们什么福利 Redis(Remote Dictionary Server)官网:https://redis.io/ Redis命令:https://redis.io/co ...
 - Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化
		
一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...
 - 日志组件Log2Net的介绍和使用(附源码开源地址)
		
Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
 - 以Spring Cache扩展为例介绍如何进行高效的源码的阅读
		
摘要 日常开发中,需要用到各种各样的框架来实现API.系统的构建.作为程序员,除了会使用框架还必须要了解框架工作的原理.这样可以便于我们排查问题,和自定义的扩展.那么如何去学习框架呢.通常我们通过阅读 ...
 - Python库:序列化和反序列化模块pickle介绍
		
1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...
 - 【浅墨著作】《OpenCV3编程入门》内容简单介绍&勘误&配套源码下载
		
经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...
 - Redis系列(六):数据结构QuickList(快速列表)源码解析
		
1.介绍 Redis在3.2版本之前List的底层编码是ZipList和LinkedList实现的 在3.2版本之后,重新引入了QuickList的数据结构,列表的底层都是QuickList实现 当L ...
 - 【分布式微服务企业快速架构】SpringCloud分布式、微服务、云架构快速开发平台源码
		
鸿鹄云架构[系统管理平台]是一个大型 企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于 模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术 (Sprin ...
 - 卷积神经网络CNN介绍:结构框架,源码理解【转】
		
1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...
 
随机推荐
- MLHPC 2016 | Communication Quantization for Data-parallel Training of Deep Neural Networks
			
本文主要研究HPC上进行数据并行训练的可行性.作者首先在HPC上实现了两种通信量化算法(1 Bit SGD以及阈值量化),然后提出了自适应量化算法以解决它们的缺点.此外,发挥出量化算法的性能,作者还自 ...
 - vue从后台拿数据渲染页面图片
			
<div class="list-content"> <div v-for="goods in goodsList" class=" ...
 - 正确理解jmeter线程组之Ramp-Up
			
Ramp-Up表示多少时间内启动线程,比如线程数100,Ramp-Up设置为10,表示10秒内启动100线程,不一定是每秒启动10个线程: 下面我们来做几个测试 线程组设置:100线程,Ramp-Up ...
 - HDFS的上传下载流程
			
hdfs上传流程 首先客户端向nn请求上传文件.nn经过检查回应客户端是否可以上传.客户端得到同意后向nn请求上传第一块文件的dn.nn返回给客户端dn的地址.客户端与其中一个dn1建立连接然后dn1 ...
 - 【C#基础概念】虚方法virtual
			
目录: 一.虚方法的概念 二.虚方法的特点 三.虚方法的作用 四.虚方法的声明 五.虚方法的执行 六.虚拟类的规则 一.虚方法的概念 在C#中,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,则 ...
 - html页面跳转出现中文乱码
			
一般html的<meta charset="UTF-8">默认都是utf-8的编码格式,直接在网页中打开是正常的,但是有的时候在页面跳转时就会出现中文乱码问题,忘了参考 ...
 - MySQL第一讲概论
			
MySQL 后期内容 Python 今日内容概要 MySQL的概念 数据库软件的安装及使用 配置文件介绍 数据库常用命令(库操作.表操作.记录操作) 今日内容详细 什么是数据库 1.单机游戏 本地保存 ...
 - linux基本篇--入门成神之路
			
一.linux基础操作 1.初识bash shell概念 shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口,他接受用户输入的命令并把它送入内核去执行,实际上shell是一个命令解释 ...
 - MySQL启动报错Failed to open log (file 'D:\phpStudy\PHPTutorial\MySQL\data\mysql_bin.000045', errno 2)
			
MySQL报错 191105 9:39:07 [Note] Plugin 'FEDERATED' is disabled. 191105 9:39:07 InnoDB: The InnoDB memo ...
 - Spark ML源码分析之三 分类器
			
前面跟大家扯了这么多废话,终于到具体的机器学习模型了.大部分机器学习的教程,总要从监督学习开始讲起,而监督学习的众多算法当中,又以分类算法最为基础,原因在于分类问题非常的单纯直接,几乎 ...