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…
文章目录
- 系列文章目录
- 前言
- 一、基本概念
- 1. 什么是前后端分离
- 2. 什么是restful风格
- 3. 什么是接口及接口文档
- 4. 如何阅读接口文档
- 二、DRF工程-django-restful-framework
- 1. DRF工程搭建
- 2. DRF官方文档导读
- 三、APIView
- 1. APIView处理Request
- 2. 视图的Response及json处理
- 3. 常见状态码及Response的状态码处理
- 四、序列化
- 1. 什么是json
- 2. 什么是序列化
- 3.QuerySet如何进行Json处理
- 4.DRF中的序列化器
前言
在当今互联网开发中,前后端分离架构和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框架 |
---|---|
HttpRequest | Request |
HttpResponse | Response |
查询参数: request.GET | request.query_params |
路径参数:路由转换器 | 路由转换器 |
请求头: request.META | request.headers |
请求体-表单: request.POST | request.data |
请求体-非表单:request.body | request.data |
解析上传文件: request.FILES | request.data |
类视图: View | APIView |
JsonResponse | Response |
render | Response |
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 的一篇文章:Django ORM的QuerySet:解锁数据库交互的魔法钥匙
返回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)
相关文章:

Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...

React基础教程:TodoList案例
todoList案例——增加 定义状态 // 定义状态state {list: ["kevin", "book", "paul"]}利用ul遍历list数组 <ul>{this.state.list.map(item ><li style{{fontWeight: "bold", fontSize: "20px"}} key{item.i…...

PHP超详细安装及应用
目录 所需安装包如下 一、PHP安装 依赖包安装 安装扩展工具(先将PHP所需的软件包全部拖进centos根目录下) 安装libmcrypt 安装mhash 安装mcrypt 安装PHP 二、设置LAMP组件环境(要保证mysql、http都安装完成了) Php.ini的建…...
【算法篇】大数加法JavaScript版
题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。 数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成 要求:时间复杂度 𝑂(𝑛) 示例1 输入&…...
【LeetCode 128】 最长连续子序列
判断前一位数在不在字典中是这道题的关键之处,这样就可以避免重复查找,从而达到O(n) 的时间复杂度。如果没有这个判断,那么时间复杂度最坏也得是O(N^2)级别的。 1. 题目 2. 分析 合理利用数据结构。本题中使用了set来保存数组的元素&#x…...

SpringCloud-面试篇(二十六)
(1)Sentinel核心API-ProcessorslotChain...
使用__try...__except和try...catch捕获异常实例分享(附源码)
在C/C++的代码中,为了防止代码块执行的过程中产生异常导致软件崩溃,我们会给代码块添加__try...__except或try...catch保护,防止软件因为操作内部触发的异常产生崩溃。本文简单地介绍一下这两种异常捕获的使用示例。 1、概述 当软件运行过程中代码抛出异常,如果异常没有处…...

基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真+程序+设计报告+讲解视频)
基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0099 1. 主要功能: 基于51单片机的简易温控水杯恒温…...

王德峰视频讲座,王德峰视频全部大全集,百度云百度网盘资源下载
王德峰教授的视频讲座其内容丰富、观点独到,深受广大学者和爱好者的喜爱。很多朋友想下载王德峰教授的讲座视频,今天我给大家分享一个下载王德峰教授视频的方法 搜索 “方圆资源网官网” 打开 “方圆资源网官网,找到王德峰教授的讲座 总之&a…...

Visual Studio和BOM历史渊源
今天看文档无意间碰到了微软对编码格式解释,如下链接: Understanding file encoding in VS Code and PowerShell - PowerShell | Microsoft LearnConfigure file encoding in VS Code and PowerShellhttps://learn.microsoft.com/en-us/powershell/scrip…...
虚拟现实(VR)游戏与增强现实(AR)游戏的区别
随着科技的飞速发展,沉浸式游戏体验已经成为现代娱乐的重要组成部分。虚拟现实(VR)游戏和增强现实(AR)游戏是这类体验中的两大主流,但它们在技术实现、用户体验和应用场景上有显著的区别。本文将详细探讨VR…...
git已经设置了自己的账号和密码,提交信息还是别人解决方法
1、运行一下命令缓存输入的用户名和密码: git config --global credential.helper wincred2、重新设置自己的邮箱和用户名 查看配置信息 git config --list修改用户名和邮箱地址: git config --global user.name 你自己的username git config --glo…...
探索面向对象与并发编程的完美融合:Java中的实践与思考
探索面向对象与并发编程的完美融合:Java中的实践与思考 在软件开发的世界里,面向对象编程(OOP)与并发编程(Concurrency)常被视为两个独立的领域。然而,Java语言却将这两个领域无缝地融合在一起,使得面向对象思想能够有效简化并发编程的复杂性。那么,如何才能用面向对…...

探索在线问诊系统的安全性与隐私保护
随着远程医疗的普及,在线问诊系统成为医疗服务的重要组成部分。然而,随着医疗数据的在线传输和存储,患者的隐私保护和数据安全面临巨大挑战。本文将探讨在线问诊系统的安全性与隐私保护,介绍常见的安全措施和技术实现,…...

How To: Localize Bar and Ribbon Skin Items
您可以使用Localizer对象自定义皮肤菜单,而不是迭代每个条形皮肤子菜单项和功能区皮肤库项容器来手动修改这些项。此方法允许您同时自定义所有现有栏子菜单和功能区库中的外观项目。 创建BarLocalizer类的派生类并重写XtraLocalizer.GetLocalizedString方法。 pub…...
通过 urllib 结合代理IP下载文件实现Python爬虫
本教程将向您展示如何使用 Python 的 urllib 库结合代理 IP 来下载文件。这种技术对于避免被目标网站封锁 IP 或简单地从不同的地理位置访问网站特别有用。通过这种方式,您可以更安全地进行网页数据的爬取和分析。 安装必须的库 在开始编写代码之前,您…...
单线服务器与双线服务器的区别?
单线服务器和双线服务器之间有什么区别呢?接下来就让小万来为大家具体分析一下吧! 首先单线服务器和双线服务器之间运营商的性质是不同的,单线服务器主要是一家带宽运营商,而双线服务器则是有两家运营商提供带宽的线路。 单线服务…...

使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件
使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件 本文将展示如何使用Hadoop MapReduce对一组学生成绩数据进行处理,将各省的学生成绩按总分降序排序并按照省份进行分区将结果分别输出到不同的文件中。 数据样例 我们将使用…...

LeetCode | 66.加一
这道题有多个思路,可以依次取数组的每一位,乘10后加下一位,直到最后一位,就得到我们数组所表示的数字,然后加一,然后把新得到的数字再转化为对应的数组,我的做法是直接取数组的最后一位…...

Oracle最终会扼杀MySQL?(译)
原文网站:https://www.percona.com/blog/is-oracle-finally-killing-mysql/ 作者:Peter Zaitsev 自从Oracle收购了MySQL后,很多人怀疑Oracle对开源MySQL的善意,这篇percona的文章深入分析了Oracle已经和将要对MySQL采取的措施&a…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...