Django API开发实战:前后端分离、Restful风格与DRF序列化器详解

news2024/11/14 12:16:37

在这里插入图片描述

系列文章目录

  • 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.comhttps://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请求方式
如果是更新数据,那么建议使用PUTPATCH方法

  • 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

APIViewDjango REST framework中的一个类,用于处理HTTP请求并返回HTTP响应APIView提供了一种基于类的视图的方式,可以更方便地编写RESTful APIAPIView可以处理GET、POST、PUT、DELETE等HTTP请求,并根据请求的类型调用对应的方法,如get()、post()、put()、delete()等。通过APIView,开发者可以更加灵活地定义API的行为和逻辑。

django框架和drf框架对比:

django框架django-drf框架
HttpRequestRequest
HttpResponseResponse
查询参数: request.GETrequest.query_params
路径参数:路由转换器路由转换器
请求头: request.METArequest.headers
请求体-表单: request.POSTrequest.data
请求体-非表单:request.bodyrequest.data
解析上传文件: request.FILESrequest.data
类视图: ViewAPIView
JsonResponseResponse
renderResponse

1. APIView处理Request

DRFrequest.POSTrequest.FILES,request.body的数据统一封装到了data属性中,其中包含了

  • 解析之后的文件非文件数据
  • POSTPUTPATCH请求方式解析后的数据
  • 表单类型数据、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方法进行字段或对象级别的验证,还可以使用自定义的validatorsDRF自带的验证器
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)

在这里插入图片描述

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

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

相关文章

NLP实战入门——文本分类任务(TextRNN,TextCNN,TextRNN_Att,TextRCNN,FastText,DPCNN,BERT,ERNIE)

本文参考自https://github.com/649453932/Chinese-Text-Classification-Pytorch?tabreadme-ov-file&#xff0c;https://github.com/leerumor/nlp_tutorial?tabreadme-ov-file&#xff0c;https://zhuanlan.zhihu.com/p/73176084&#xff0c;是为了进行NLP的一些典型模型的总…

Day 25 二叉树的终止

450.删除二叉搜索树中的节点 不理解用tmp保存root节点&#xff0c;然后删除&#xff1f;rootroot->right不会覆盖吗&#xff1f; 需要考虑要删除的节点是不是叶子节点&#xff0c;有无左右孩子 有左右孩子的话&#xff0c;需要将左孩子节点移动到右孩子节点的左面节点的左…

Python | Leetcode Python题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:…

element-plus 的el-scrollbar滚动条组件

el-scrollbar组件可以替换原生的滚动条&#xff0c;可以设置出现滚动条的高度&#xff0c;若无设置则根据容器自适应。 通过使用 setScrollTop 与 setScrollLeft 方法&#xff0c;可以手动控制滚动条滚动。 scroll 滚动条的滚动事件&#xff0c;会返回滚动条当前的位置。 &l…

机器学习--生成式模型和判别式模型的具体分析

文章目录 生成式模型和判别式模型的具体分析生成式模型定义工作原理优点缺点常见模型 判别式模型 总结生成式模型判别式模型 生成式模型和判别式模型的具体分析 生成式模型和判别式模型在机器学习中有着不同的目标、应用场景和性能特点。以下将详细分析它们的定义、工作原理、…

《庆余年》角色穿越高考:谁将笑傲现代考场?

一、引言 《庆余年》是一部以古代中国为背景的权谋小说&#xff0c;其角色们各具特色&#xff0c;聪明才智、武艺高强、忠诚耿直等特质使得他们在古代世界中游刃有余。然而&#xff0c;如果我们将这些角色置于现代高考的背景之下&#xff0c;他们将如何面对这一挑战&#xff1…

C# WPF入门学习主线篇(二十)—— 资源和样式

C# WPF入门学习主线篇&#xff08;二十&#xff09;—— 资源和样式 欢迎来到C# WPF入门学习系列的第二十篇。在前面的章节中&#xff0c;我们探讨了布局管理及各种控件的使用。本篇博客将重点介绍WPF中的资源&#xff08;Resource&#xff09;和样式&#xff08;Style&#xf…

抛弃昂贵BI,企业仍可低成本实现数据分析

有的读者看完《BI工具选型不入坑&#xff0c;你要这么选》这篇文章就陷入迷茫了&#xff0c;我要做企业级数据分析&#xff0c;看过去各家产品都各有千秋&#xff0c;实在难以抉择&#xff0c;或者已经选了仍是纠结不已。 这里我抛出另一种思路&#xff1a;如果不用BI&#xf…

MySQL 5.7详细下载安装配置教程(MySQL 5.7安装包)_mysql5.7的安装教程

记录MySQL 5.7 的下载安装教程&#xff0c;并提供了Mysql 安装包 &#xff0c;以下是详细下载安装过程。 一、下载Mysql安装包 网盘下载&#xff1a; 下载MySQL 5.7安装包&#xff0c;网盘下载地址&#xff1a;点击此处直接下载 官网下载&#xff1a; 进入官网&#xff0c…

如何稳定高效地进行 TiDB 数据导入导出?

对于在数据库行业中摸爬滚打多年的老鸟 DBA 来说&#xff0c;TiDB 可是一点也不陌生&#xff0c;作为 PingCAP 公司自主研发的真开源分布式数据库&#xff0c;其先进的设计理念以及丰富的生态工具&#xff0c;可算得上是业界自主创新和性能领先的代名词。 TiDB 是谁&#xff1…

《Brave New Words 》3.4 最重要的学科领域

Part III Empowering the Next Innovators 第三部分 赋能下一代创新者 The Most Important Subject-Matter Domain to Master 最重要的学科领域 In the world of education, it’s crucial for developers to field-test their ideas. Essentially, it means taking our educat…

LabVIEW进行图像拼接的实现方法与优化

在工业检测和科研应用中&#xff0c;对于大尺寸物体的拍摄需要通过多次拍摄后进行图像拼接。LabVIEW 作为强大的图形化编程工具&#xff0c;能够实现图像拼接处理。本文将详细介绍LabVIEW进行图像拼接的实现方法、注意事项和提高效率的策略。 图像拼接的实现方法 1. 图像采集…

前端UI框架Element Plus 和 Ant Design Vue哪个好

Element Plus 和 Ant Design Vue 都是基于 Vue.js 的 UI 组件库&#xff0c;它们具备一系列可复用的组件和丰富的功能&#xff0c;并且是当前国内主流的两个 UI 组件库。 &#xff08;1&#xff09;Element Plus 是饿了么前端团队推出的开源项目&#xff0c;是对 Element UI 的…

基于Python + Flask+ Mysq实现简易留言板

使用Python Flask Mysql实现简易留言板&#xff0c;包括网友编辑留言、修改留言&#xff0c;删除留言、分页显示四大功能。 写出留言板建设过程&#xff0c;包括开发使用工具、留言板模块设计、数据库设计、页面设计、关键技术。 留言板建设过程总结 一&#xff0e;开发使用…

RapidMiner数据挖掘4 —— 决策树

0. 序章 0.1 文本说明 所有应用程序操作的名称和编程说明都以黄色背景书写&#xff0c;问题以蓝色背景书写&#xff0c;以方便他们在文本中识别。 在整个课程中&#xff0c;请逐步遵循所有说明&#xff0c;并确保获得预期结果&#xff0c;然后再继续下一部分或问题。 通过在Ub…

文刻ai工具跟绘唐AI工具有什么区别

文刻AI工具和绘唐AI工具是两种不同的人工智能工具。点击查看 文刻AI工具是一种自然语言处理工具&#xff0c;可以用于生成、修改和校对文本。它可以帮助用户更高效地写作&#xff0c;提供词汇和语法建议&#xff0c;检查拼写和语法错误&#xff0c;并提供自动补全和自动纠正功…

网络安全难学吗?2024该怎么系统学习网络安全?

学习网络安全需要循序渐进&#xff0c;由浅入深。很多人对网络安全进行了解以后&#xff0c;就打算开始学习网络安全&#xff0c;但是又不知道怎么去系统的学习。 网络安全本身的知识不难&#xff0c;但需要学习的内容有很多&#xff0c;其中包括Linux、数据库、渗透测试、等保…

ue5肉鸽游戏视频教程学习记录

先在虚幻商城下载免费的paperzd插件&#xff0c;并启用。 导入资源后&#xff0c;先通过应用paper2d纹理资源&#xff0c;将去掉导入ue时产生的边缘模糊&#xff0c;再点击下面的创建瓦片集&#xff0c; 打开瓦片集&#xff0c;发现选中不对&#xff0c; 改变瓦片大小为16*…

64. UE5 RPG 创建新的双手攻击怪物

在上一篇文章中&#xff0c;我们实现了新的功能&#xff0c;现在可以创建多个普通攻击动画&#xff0c;并且可以根据你所使用的普通攻击动画&#xff0c;设置不同的攻击位置。比如&#xff0c;你使用武器&#xff0c;那么攻击位置需要从武器上获取&#xff0c;如果你没有持有武…