1.restful规范

# restful是一种定义API接口的设计风格,API接口的编写规范,尤其适用于前后端分离的应用模式中

这种风格的理念人为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源

我们可以使用任何一个框架都可以实现符合restful规范的API接口

# 10条规范
1.数据的安全保障,通常使用https协议进行传输 2.url地址中带接口标识:一般这样
-https://api.baidu.com
-https://www.baidu.com/api 3.多版本共存,url地址中带版本信息(v1 v2版本信息)
https://api.baidu.com/v1/login/
https://api.baidu.com/v2/login/ 4.数据即是资源,均使用名词:
url地址尽量使用名词
# 接口一般都是完成前后台数据的交互,交互的数据我们称之为资源
https://api.baidu.com/users
https://api.baidu.com/books
https://api.baidu.com/book
注:一般提倡用资源的复数形式,在url链接中不要出现操作资源的动词,错误示范:https://api.baidu.com/delete-user
# 特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义
https://api.baidu.com/place/search
https://api.baidu.com/login 5.资源操作由请求方式决定
# 操作资源一般都会涉及到增删改查,我们提供请求方式来标识增删改查动作
https://api.baidu.com/books - get请求:获取所有书
https://api.baidu.com/books/1 - get请求:获取主键为1的书
https://api.baidu.com/books - post请求:新增一本书书
https://api.baidu.com/books/1 - put请求:整体修改主键为1的书
https://api.baidu.com/books/1 - delete请求:删除主键为1的书 6.url地址中带过滤条件 ?后带过滤条件
https://api.baidu.com/books -get请求表示查询所有图书,要查名字中有红的图书
https://api.baidu.com/books?name_contains=红
https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件 7.响应状态码(http响应中带状态码)
-http的响应状态码:https://blog.csdn.net/meng2lin/article/details/128955775
-1xx:请求正在处理
-2xx:请求成功 200 201
-3xx:重定向
-4xx:客户端错误
-5xx:服务的错误
-http的响应的数据中带状态码(公司自己规定的)
-{code:100}
8.返回的数据中带错误信息
{code:101,msg:用户名或密码错误}
{code:100,msg:成功} 9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
GET /books:返回资源对象的列表(数组)
-[{name:水浒传,price:88},{name:西游记,price:88}]
-{code:100,msg:成功,data:[{name:水浒传,price:88},{name:西游记,price:88}]}
GET /books/1:返回单个资源对象
-{name:水浒传,price:88} ---{code:100,msg:成功,data:{name:水浒传,price:88}}
POST /books:返回新生成的资源对象
-{id:4,name:水浒传,price:88} ---{code:100,msg:成功}
PUT /books/4:返回完整的资源对象
-{id:4,name:水浒传,price:188} ---{code:100,msg:修改成功}
DELETE /books/4: 返回一个空文档 ---{code:100,msg:删除成功}
10.返回的结果中带url链接

2.序列化和反序列化

# api接口开发,最核心最常见的一个过程就是序列化
# 序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象(queryset),但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。 # 反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中 # 序列化:drf称为 read 序列化
# 反序列化:drf称为 write 反序列化

3.drf介绍和快速使用

3.1 drf介绍

	# Django中有个app djangorestframework(简称drf),帮助我们快速实现符合resful规范的接口
# pip下载:(有个坑)
pip install djangorestframework==版本号
# 如果你是django2, 直接这样装,装最新drf,他们不匹配---》pip会自动把django卸载,安装最新django,安装最新drf # django3,这样没有任何问题
pip install djangorestframework --upgrade # 补充:
-如果写了一个包,或app,想给别人用---》把你写的包,放到pypi上别人pip install 安装---》使用

3.2 drf快速使用

在应用下创建一个py文件 序列化类(serializer.py)
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
路由urls
from app01.views import BookView
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('books',BookView,'books')
urlpatterns = [
]
urlpatterns += router.urls
试图
from .serializer import BookSerializer
from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):
queryset = Book.Objects.all()
serializer_class = BookSerializer

4.drf之APIView源码分析

4.1 基于APIView的5个接口

序列化类
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
路由
urlpatterns = [
path('books/', BookView.as_view()),
path('books/<int:pk>/', BookDetailView.as_view()),
]
视图类
from rest_framework.views import APIView # APIView继承了django原来的View
from .serializer import BookSerializer
from rest_framework.response import Response class BookView(APIView):
# 查询所有
def get(self,request):
book_list = Book.objects.all()
# drf提供了序列化类(先别关注)
ser = BookSerializer(instance=book_list,many=True) # 序列化
return Response({'code':100,'msg','成功','result':ser.data}) def post(self,request):
ser = BookSerializer(data=request.data) # 反序列化
if ser.is_valid(): # 数据校验---》有些不合翻的禁止
ser.save() # 保存到数据库中
return Response({'code': 100, 'msg': '成功'}) class BookDetailView(APIView):
# 查询单条
def get(self,request,pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializer(instance=book,many=False) # 序列化
return Response({'code': 100, 'msg': '成功', 'result': ser.data}) # 修改一条
def put(self,request,pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializer(instance=book,data=request.data) #反序列化
if ser.is_valid(): # 数据校验---》有些不合法的禁止
ser.save() # 保存到数据库中
return Response({'code': 100, 'msg': '成功'}) def delete(self,request,pk):
Book.objects.filter(pk=pk).delete()
return Response({'code': 100, 'msg': '删除成功'})

4.2 CBV源码分析

# cbv写法:
1 视图中写视图类,继承View,写跟请求方式同名的方法
class BookView(View):
def get(self,request):
return 四件套
2 在路径用写
path('books/', BookView.as_view()) # 前置条件:前端请求,一旦路径匹配成功,就会执行 BookView.as_view()(request传入,)
# 入口在 BookView.as_view()--->执行结果---》View中有个as_view类的绑定方法
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
res=self.dispatch(request, *args, **kwargs)
return res
return view
# 执行结果是view 的内存地址: 请求来了,执行view(request)
path('books/', view) # 执行 View类中的as_view方法中的内层的view函数,路由匹配成功,本质是在执行
self.dispatch(request, *args, **kwargs)
# self是谁的对象?BookView的对象
# 去BookView中dispatch,找不到,去父类,View中找到了 # View这个类的dispatch
def dispatch(self, request, *args, **kwargs):
# request.method.lower() 如果是get请求, ‘get’ 在这个列表里面
if request.method.lower() in self.http_method_names:
# handler=getattr(BookView的对象,'get')
# handler就是BookView类中的get方法
handler = getattr(self, request.method.lower())
else:
handler = self.http_method_not_allowed
# 执行 BookView类中的get方法 (request)
return handler(request, *args, **kwargs)
# 最后结论:什么请求方式,就会执行试图类中的什么方法

4.3 APIView执行流程分析

# 有了drf,后期都写CBV,都是继承APIView及其子类
# 执行流程
入口:path('books/',BookView.as_biew())--->请求来了,执行BookBView.as_view()(request)
as_view 先从自己写的类中查找--->再到父类APIView中找
@classmethod
def as_view(cls, **initkwargs):
view = super().as_view(**initkwargs)
# super()代指的是:APIView父类对象 View类的对象
# View的as_view(**initkwargs)----》执行结果是view,是View类的as_view方法中的view
view=csrf_exempt(view) # 局部禁用csrf,
return view path('books/', View类中的as_view中的view,只是去掉了csrf的认证)
请求来了,执行 【View类的as_view中的view,只是去掉了csrf的认证+(request)调用】
执行:self.dispatch(request, *args, **kwargs) # self是自己写的类的对象
'''self要从根上找 先从自己写的类中找--->再从自己写的类继承的父类APIView中找'''
self.dispatch 是APIView中的dispatch,源码如下
def dispatch(self, request, *args, **kwargs):
# request是老的request
request = self.initialize_request(request, *args, **kwargs)
# request是新的request
self.request = request
try:
# 执行了认证,权限和频率
self.initial(request, *args, **kwargs)
# 在执行视图类方法之前,去掉了csrf认证,包装了新的request,执行了认证频率和权限
#### 执行请求方式字符串对应的方法
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
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 # 总结:
1 以后只要继承APIViwe的所有试图类的方法,都没有csrf的校验了
2 以后只要继承APIView的所有视图类的方法中的request是新的request了
3 在执行试图类的方法之前,执行了三大认证(认证,权限,频率)
4 期间出了各种错误,都会被异常捕获,统一处理

drf——restful规范、序列化反序列化、drf介绍和快速使用、drf之APIView源码的更多相关文章

  1. Restful规范-APIView源码分析

    目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...

  2. Restful 1 -- REST、DRF(View源码解读、APIView源码解读)及框架实现

    一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? - url用来唯一定位资源,http请求方式来区分用户行为 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下 ...

  3. DRF(1) - REST、DRF(View源码解读、APIView源码解读)

    一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...

  4. REST、DRF(View源码解读、APIView源码解读)

    一 . REST            前言 1 . 编程 : 数据结构和算法的结合 .小程序如简单的计算器,我们输入初始数据,经过计算,得到最终的数据,这个过程中,初始数据和结果数据都是数据,而计算 ...

  5. 探索drf执行流程之APIView源码分析

    Django REST framework 简介 现在新一代web应用都开始采用前后端分离的方式来进行,淘汰了以前的服务器端渲染的方式.而实现前后端分离是通过Django REST framework ...

  6. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  7. Django框架之drf:8、断点调试,权限、认证、频率组件源码分析,基于APIView编写分页,异常处理

    Django框架之drf 一.断点调式使用 ​ 指,在我们编写代码的时候,程序运行出现报错是无可避免的,当程序 出现报错时,我们需要找到出现报错的代码进行修改,如果时简短的代码很容易就可以找到报错位置 ...

  8. DRF中的APIView源码分析

    首先写一个简单的drf接口 from rest_framework.views import APIView from rest_framework.response import Response ...

  9. drf的基本使用、APIView源码分析和CBV源码拓展

    cbv源码拓展 扩展,如果我在Book视图类中重写dispatch方法 -可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果 def dispatch(self, requ ...

  10. LRU算法介绍和在JAVA的实现及源码分析

    一.写随笔的原因:最近准备去朋友公司面试,他说让我看一下LRU算法,就此整理一下,方便以后的复习. 二.具体的内容: 1.简介: LRU是Least Recently Used的缩写,即最近最少使用. ...

随机推荐

  1. 织梦(DedeCMS)安全方案

    一.织梦(DedeCMS)介绍 织梦(DedeCMS)作为国内龙头CMS系统之一,因其系统结构科学合理,操作使用简单,拥有海量用户.和其他CMS一样,安全漏洞也是其无法避免的问题.虽然官方不断发布补丁 ...

  2. python abseil库(app, flags, logging)总结

    absl (Abseil PythonCommon Libraries)(https://abseil.io/docs/python/)是用于构建Python应用程序的Python库代码集合,它包括三 ...

  3. 如何建设私有云原生 Serverless 平台

    随着云计算的普及,越来越多的企业开始将业务应用迁移到云上.然而,如何构建一套完整的云原生 Serverless 平台,依然是一个需要考虑的问题. Serverless的发展趋势 云计算行业从 IaaS ...

  4. 基于 Gitlab + Harbor + K8s + Kuboard 的 CI 实践

    CI/CD 概念 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.作为一种面向开发和运维团队的解决方案,CI/CD 主要 ...

  5. 翟佳:StreamNative 组织构建之路丨声网开发者创业讲堂 • 第 5 期

    前言 翟佳,StreamNative 联合创始⼈,Apache Pulsar PMC 成员与 Committer.之前任职于 EMC,担任统⼀存储部⻔技术负责⼈. 在声网开发者创业讲堂 • 第 5 期 ...

  6. Java面试——Nginx

    一. 二.Nginx 的优点 [1]速度更快:这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应:另一方面,在高峰期(如有数以万计的并发请求),Nginx 可以比其他 Web服务器更快地 ...

  7. Java (强/弱/软/虚)引用

    一.整体架构

  8. 相同基准点的多个rvt BIM模型数据配准后位置有错位偏差问题处理

    场景:提供的bim模型数据包含多个rvt格式数据,这些数据具有相同的基准点,如: 在使用ArcGIS Pro处理了其中两份rvt格式数据(建筑和给排水),发布后在前端展示发现数据错位: 红色管线的给排 ...

  9. [云计算]杂谈:SaaS与PaaS的产品经理,做产品设计时有什么区别?[摘]

    本文摘自: 郝雨彤@碧岸久 于 2022-09-20在社交平台中所表达的观点. 产品性质/类型 服务领域 服务对象(受众) 核心能力 SaaS 面向具体业务 (所属行业的)业务用户 很看重对业务的理解 ...

  10. [J2EE:中间件]LOG4J+Slf4J快速入门及日志最佳实践

    1 概述 1.1 常见的Java日志框架及选择 commons-logging和slf4j(slf4j-api.jar)都是日志类库的接口,供客户端使用,而没有提供实现! log4j,logback等 ...