ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
[打印本页]
作者:
东湖之滨
时间:
2024-6-11 08:48
标题:
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
系列文章目录
Django入门全攻略:从零搭建你的第一个Web项目
Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图利用
Django ORM实战:模型字段与元选项设置,以及链式过滤与QF查询详解
Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
跨域问题与Django办理方案:深入解析跨域原理、请求处理与CSRF防护
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
还在写0.0…
媒介
在当今互联网开发中,前后端分离架构和Restful风格API成为主流。本文将深入探讨前后端分离、Restful风格、接口文档的概念,并重点介绍DRF(Django-Rest-Framework)的使用,包罗APIView处理请求与响应的方法,以及序列化的重要性。
一、根本概念
1. 什么是前后端分离
传统的不分离:
用户在欣赏器上发送请求,服务器端接收到请求,根据 Header 中的 token 进行用户鉴权,从数据库取出数据,处理后将结果数据填入 HTML 模板,返回给欣赏器,欣赏器将 HTML 展现给用户,不分离的核心就是模版,比如 Django 直接将返回数据到模版,通过模版表单将数据返回至后端
前后端不分离的特点:
业务耦合较强
职责划分不明确
开发成本较高
服务器压力较大
可进步 SEO 速率,进步搜刮引擎收录检索速率
现在的前后端分离:
数据渲染的工作在客户端欣赏器,不需要服务端完成,
服务端专注于提供数据
。那么这就要求
Django
框架不需要返回一个模版页面,而是返回一套
JSON
数据,而由于
JSON
可以在多种语言中支持,是一种交互、兼容非常合适的语言格式,以是现在背景常返回的数据都为
JSON
格式的,这个过程也称作
序列化
前后端分离的特点:
摆设解耦
业务划分清楚,职责更为明确
开发成本较低,一套背景可以支持多套前端渲染
SEO 优化较差,需要引入一些页面静态化手段
2. 什么是restful风格
在前后端分离的应用模式里,API接口如何界说?是否存在一种统一的界说方式,被广大开发人员接受认可的方式呢?
restful风格
–
指的是前后端交互的接口的格式界说
RestFul 规范建议:
1. 域名要有标识:
Restful 风格建议,Api 服务器的域名要尽量在专用域名之下
例如:百度面向用户的站点地址为 https://baidu.com
那么,其后端接口地址可以为:
https://api.baidu.com 或 https://baidu.com/api/
2.路由中表现接口版本号
例如:
https://api.baidu.com/v1/
https://baidu.com/api/v1/
http://openapi.tuling123.com/openapi/api/v2
3. url 建议名词复数
例如:
/goods/ 获取全部商品
/infos/
/addresses/
path("news/", NewsView.as_well())
path("news/<int:id>", NewsView.as_well())
4.使用合理的请求方式
例如:
对应利用,应该返回利用后的资源结果,比如
获取数据
,那就应该使用
GET
请求方式
如果是
更新数据
,那么建议使用
PUT
或
PATCH
方法
GET
:获取数据
POST
:提交数据,创建数据
PUT
:提交数据,更新数据
DELETE
:删除数据
还有三个不常用的
HTTP
动词:
PATCH
:在服务器更新(更新)资源
HEAD
:获取资源的元数据
OPTIONS
:获取信息,关于资源的哪些属性是客户端可以改变的
提供参数过滤数据:
如果数据较多,返回全部数据是不现实的,那么可以让
API
提供参数,进行结果返回
?limit=10:指定返回记载的数目
?offset=10:指定返回记载的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记载数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序次序。
?animal_type_id=1:指定筛选条件
5.使用合理的状态码:(示例如下)
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
204 NO CONTENT - [DELETE] # 用户删除数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
----------------------------------------------------
400 INVALID REQUEST - [POST/PUT/PATCH] # 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized - [*] # 表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] # 表示用户得到授权(与 401 错误相对),但是访问是被禁止的。
404 NOT FOUND - [*] # 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
405 请求方式错误
406 Not Acceptable - [GET] # 用户请求的格式不可得(比如用户请求 JSON 格式,但是只有 XML 格式)。
410 Gone -[GET] # 用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] # 当创建一个对象时,发生一个验证错误。
---------------------------------------------------
500 INTERNAL SERVER ERROR - [*] # 服务器发生错误,用户将无法判断发出的请求是否成功
复制代码
3. 什么是接口及接口文档
API,全称是Application Programming Interface,即
应用步伐编程接口
,我们一样平常中习惯简称为“
接口
”。
比如我们要实现一个手机注册的功能,那么相应地背景工程师就需要提供一个手机注册的接口,前端开发人员在调用接口实现功能的时候,只需按照既定的规则进行请求即可,不需要去理解该功能的实现逻辑。有了这么一个机制,就使得开发人员间的协作变得非常简洁、高效。
以是,可以简单地理解为“
接口决定了功能
”。
接口文档又称为API文档
,一样平常是由背景开发人员所编写的,用来形貌体系所提供接口信息的文档。 大家都根据这个接口文档进行开发,并需要一直维护和遵守。
4. 如何阅读接口文档
API接口文档一样平常分为接口形貌、接口地址、请求方法、请求参数、响应内容、错误代码、实例几个部分:
接口形貌:
简单形貌接口的逻辑和作用。例如分析这是一个发送消息的接口、查询气候的接口;
接口地址:
这个地址表示的是网络地址,即url,我们需要调用接口url,获取响应内容;
请求方法:
常见的请求方法为GET和POST;
请求参数:
用来传递信息的变量。即需要请求的字段名的名称和规则:都是哪些字段,字段的类型是什么,是否必填字段等等;
响应内容:
接口返回的字段名称和规则;
错误代码:
对接口的错误用代码进行归类,以便能快速找到错误原因,办理问题;
实例:
实际调用时的响应的内容。
二、DRF工程-django-restful-framework
1. DRF工程搭建
安装
DRF
框架
pip install djangorestframework -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
设置 settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
复制代码
2. DRF官方文档导读
这个框架封装了很多很多复用的功能:
将请求的数据转换为模型类对象
利用数据库
将模型类对象转换为响应的数据如
JSON
格式
视图封装
:
DRF
统一封装了请求的数据为
request.data
以及返回数据的
Response
方法
序列化器
:
DRF
提供了
序列化器
可以统一便捷的进行
序列化
及
反序列化
工作
认证:对用户
登陆
进行
身份验证
权限:对用户
权限
进行
认证
,超级用户、平凡用户、匿名用户啥的
限流:对访问的用户
流量进行限制
,
减轻
接口的
访问压力
过滤:可以对列表数据进行字段
过滤
,并可以通过添加
django-fitlter
扩展来增强支持
排序:来资助我们快速指明数据按照指定字段进行
排序
分页:可以对数据集进行
分页
处理
非常处理:
DRF
提供了非常处理,我们可以
自界说非常处理
函数
接口文档生成:
DRF
还可以主动生成接口文档
三、APIView
APIView是Django REST framework中的一个类,用于处理HTTP请求并返回HTTP响应
。APIView提供了一种基于类的视图的方式,可以更方便地编写RESTful API。APIView可以处理GET、POST、PUT、DELETE等HTTP请求,并根据请求的类型调用对应的方法,如get()、post()、put()、delete()等。通过APIView,开发者可以更加灵活地界说API的行为和逻辑。
django框架和drf框架对比:
django框架django-drf框架HttpRequestRequestHttpResponseResponse查询参数: request.GETrequest.query_params路径参数:路由转换器路由转换器请求头: request.METArequest.headers请求体-表单: request.POSTrequest.data请求体-非表单:request.bodyrequest.data解析上传文件: request.FILESrequest.data类视图: ViewAPIViewJsonResponseResponserenderResponse
1. APIView处理Request
DRF
将
request.POST
、
request.FILES
,
request.body
的数据统一封装到了
data
属性中,其中包含了
解析之后的
文件
、
非文件
数据
对
POST
、
PUT
、
PATCH
请求方式
解析后的数据
表单类型
数据、
JSON
类型数据
# app/views.py
from rest_framework.views import APIView
class ExampleView(APIView):
def post(self, request):
data = request.data # json/form 提交的数据
return Response({'received data': request.data})
复制代码
DRF
为了更准确的表示这是
从连接
里取得数据,从而把
request.GET
的名字更换为了
request.query_params
,其余利用与
request.GET
一样,这里只是
拼写更换
# app/views.py
from rest_framework.views import APIView
class ExampleView(APIView):
def get(self, request):
data = request.query_params # get 的连接传参
return Response({'received data': request.query_params})
复制代码
2. 视图的Response及json处理
目前在
DRF
中,我们所使用最多的就是
Response
这个方法,常常使用已经
序列化
好的数据结合
Response
返回
Response(data=None, status=None, template_name=None, headers=None, exception=False, content_type=None)
'''
data: 需要返回的数据
status: 状态码
headers: 头部信息
content-type: 返回数据 MIME 类型,一般不要多余设置,drf 会自动根据数据进行设置
'''
复制代码
需要注意的是,在
Response
函数的第一个参数位置上,这个
data
不能是复杂结构的数据,比如
ORM
查询到的数据,
ORM
的数据需要提取出来成为
Python
的数据类型或者使用序列化方式将其加工才可以使用
Response
进行返回
3. 常见状态码及Response的状态码处理
200 OK - [GET] # 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH] # 用户新建或修改数据成功。
202 Accepted - [*] # 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] # 用户删除数据成功。
复制代码
四、序列化
1. 什么是json
这一种在各个编程语言中流通的数据格式,可以在不同的编程语言中的进行
数据传递
和
交互
也就是用
JSON
传输数据可以让不同语言之间可以跨越语言不同的鸿沟,固然 python 无法和 js 进行通信,但是通过
JSON
,就可以让两者进行数据通信,以是现在常见的接口返回的数据都是
JSON
格式
2. 什么是序列化
序列化
:就是把模型层的数据返回为
JSON
数据集—>将模型类对象转换为响应的数据如
JSON
格式
反序列化
:就是把前端发来的
JSON
数据,类字典数据,变为模型层的数据—> 前端json数据–转换成 模型对象
3.QuerySet如何进行Json处理
QuerySet对象是Django-ORM中查询数据返回的雷同列表的多数据集合
详细介绍QuerySet 的一篇文章: 正在整理ing…
返回QuerySet的过滤器方法有:
all : 返回全部数据的QuerySet
filter : 返回满足条件的QuerySet
exclude : 返回条件之外的QuerySet
复制代码
对QuerySet进行手动处理:
# 序列化
#query_set<[object, obj2]>
book_set = Book.objects.all()
books = []
# 遍历 每一个 模型对象
for book in book_set:
books.append({
'id': book.id,
'btitle': book.btitle,
'price': book.price,
'bread': book.bread,
'bcomment': book.bcomment
})
复制代码
反序列化
:django将前端传递的json格式的字符串数据接收并转换为模型对象,这个过程称之为
反序列化
对获取的json数据,手动进行反序列化:
#获取前端传递数据
json_dict = request.data
json_dict = {
"btitle":"光年",
"price":18.8,
"bread":20,
"bcomment":200
}
# 模型对象,将获取的json格式数据插入
obj = Book()
obj.btitle = json_dict['btitle']
obj.price = json_dict['price']
obj.bread = json_dict['bread']
obj.bcomment = json_dict['bcomment']
ojb.save()
复制代码
4.DRF中的序列化器
DRF中,给我们提供了一个实现序列化的组件,也叫
序列化器
,就是serializers。
serializers序列化组件:
序列化过程
:可以把我们用ORM产生的QuerySet对象转换成json格式数据;
反序列化过程
:可以实现数据校验功能,并把客户端发送过来的数据(前端json格式字符串),经过request.data以后变成字典,再把字典转成模型,存到数据库;
序列化器特点:
1、将复杂的数据结构与python对象之间进行
转换
;
2、可以根据输入和输出数据的需要进行
多级嵌套
。
3、
改变序列化输出数据的格式
可以通过指定字段的source来源,使用SerializerMethodField自界说方法以及使用嵌套序列化器。
4、
支持可以自界说验证和转换方法
:反序列化时需要对客户端发送的数据进行验证。可以通过自界说validate方法进行字段或对象级别的验证,还可以使用自界说的validators或DRF自带的验证器。
5、当使用嵌套序列化器后,多个关联模型同时的创建和更新的行为并不明确,
需要显示地重写create和update方法
。
平凡序列化器(Serializer)代码示例:
class BookSerializer(serializers.Serializer):
btitle = serializers.CharField(max_length=20, label='图书名称')
price = serializers.DecimalField(max_digits=7, decimal_places=2, label='单价')
bread = serializers.IntegerField(default=0, required=False, label='阅读量')
bcomment = serializers.IntegerField(default=0, required=False, label='评论量')
img = serializers.ImageField(label='封面图片', required=False)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4