【Django】 rest_framework接口开发流程及接口功能组成

rest_framework接口开发流程及接口功能组成


使用restframework框架开发接口,方式应该有6、7种,每个人的习惯不同,用的方法也不一样,再次不再一一详述。
我比较常用:ModelSerializer+GenericAPIView
原因是用视图函数+装饰器、视图类+继承APIView、或者混入Mixin这三种封装层次有点低,用一个封装层次低的接口,通常意味着你需要写更多的代码,后期也需投入更多的精力去维护它,当然,好处是写出来的代码比较容易看懂;而使用ViewSets(视图集)则刚好相反,ViewSets封装了GenericAPIView,它显得有些画蛇添足,过高的封装层次可能会让你感到云里雾里,当然,好处是用熟了之后会很爽。
所以,在能理解和接受的程度与接口封装的层次两方面来权衡,我选择了GenericAPIView来写视图,ModelSerializer当然也比单纯的Serializer更好用,写更少的代码,做更多的事。


1 Django rest_framework开发的一个符合RESTful标准的接口组成及功能

Django框架它整个采用的是MVT的架构,这三部分各司其职,由M负责与数据库的实际交互;V负责业务逻辑;T负责接受请求与展示响应(实际就是前端)。那我们可以这么理解,只要有一个东西它具备了接受请求(入参)与展示响应(返回值)的功能,我们就可以把它当成T,因为它具备了T的功能。前后端不分离的时候,一切都是那么的美好。
当前后端分离的时候,我们突然发现,T不见了。那么谁来充当T的角色呢,没错是Serializer(负责接受请求与展示响应)。这样一来,前后端分离与不分离,就有了一个统一的架构,也即一个接口通常由三大主要的部分组成:模型、视图、序列化器

1.1 模型M(models.py)

在Django框架的MVT架构中,M承担了与数据库进行交互的功能,但是由于我们用的是ORM,所以只需要将python对象映射到数据模型即可,也就是定义python对象,并在该对象中声明相应的字段。需要注意的一点是,在定义python对象之前,需要先绘制ER图,明确实体间的关系,确保每一个实体,都至少遵循第三范式(3NF)。

说明:前后端分离与不分离,models并没有什么区别

1.2 序列化器T(Serializers.py)

前后端不分离的时候,T其实就是前端,接受请求并返回响应数据。
前后端分离的时候,序列化器承担了这个功能,接受前端请求返回响应数据
如果使用ModelSerializer来定义序列化器,那么它大概长这个样子:

"""
序列化器
"""from rest_framework import serializers
from .models import *
import reclass MyModelSerializer(serializers.ModelSerializer):"""MyModel 序列化器"""class Meta:"""model 模型fields 接口入参extra_kwargs 入参的约束"""model = MyModelfields = ('name', 'mobile')extra_kwargs = {'mobile': {'write_only': True,'min_length': 8,'max_length': 16,}}def validate_name(self, name):"""对name的校验"""if User.objects.filter(username=username).count():raise serializers.ValidationError("该用户名已被注册")return namedef validate_mobile(self, mobile):"""判断手机号格式判断手机号是否已注册"""# 注册if User.objects.filter(mobile=mobile).count():raise serializers.ValidationError("该手机号已被注册")# 判断手机号码格式是否有误REGEX_MOBILE = '1[358]\d{9}$|^147\d{8}$|^176\d{8}$'# 格式if not re.match(REGEX_MOBILE, mobile):raise serializers.ValidationError("手机号格式有误")return mobiledef create(self, validated_data):"""validated_data 通过校验的数据 是一个字典Serializer中重写create可以对数据做一些修改最终将返回一个实例 该实例会给到对应的视图View"""user = super().create(validated_data)# Your codereturn user

在序列化器Serializer中,容易让人感到困惑的可能就是前端字段校验这一块。其实,我们回到Serializers的功能接受前端请求返回响应数据,就能明白为什么它要序列化与反序列化。

  • 序列化:python对象转变为可传输(可被用于前端渲染)的JSON格式(也可能是xml等)字符串,究其原因是因为我们用的ORM,第一步ORM读数据,拿出来的是一个查询集(set对象),需要把它变成前端喜欢的样子。
  • 反序列化字符串变为python对象。从前端得到的入参,必然是字符串格式,想要把它存到数据库里,还得靠ORM,但是ORM喜欢的是python对象,所以需要一个反序列化的过程。

在反序列化的过程中,我们不希望用户输入一些非法的参数,所以要在Serializer中定义入参的约束与自定义的校验方式,校验通过则返回一个模型的实例给视图,否则返回错误信息。
这就是Serializer的功能与Model及View之间的关系。

1.3 视图V(views.py)

模型和序列化器固然重要,但是视图才是核心,因为通常情况下,业务逻辑都集中在views中,由视图完成。

在视图中你可以通过重写get/create方法,完成业务逻辑。
如果你像我一样使用的是GenericAPIView来写视图函数,那么你的View应该长这个样子:


class MyModelCreateView(generics.CreateAPIView):"""创建视图"""# permission_classes = [permissions.IsAuthenticated]queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef post(self, request, *args, **kwargs):"""重写post 四核可以不用重写"""serializer_data = MyModelSerializer(data=request.data)if serializer_data.is_valid():return super().post(request, *args, **kwargs)else:return Response(serializer_data.errors)def create(self, request, *args, **kwargs):"""重写create 写自己的业务逻辑如果继承的是ListAPIView 就重写create"""# 获取前端传入的数据field= request.POST.get("xx")# Your codereturn JsonResponse(data={'data': data,'msg': 'OK','code': 1,},safe=False)

重写create/get方法时,通过reques获取从前端传过来的入参,拿到入参之后,你就可以写自己的业务逻辑了。


2 Django DRF 接口开发步骤

  • 模型设计,需要注意关系规范化
  • 序列化器,需要知道哪些是入参,分别需要怎样的约束
  • 视图,写业务逻辑、权限配置、过滤查询分页等

我通常是先写模型,然后是序列化器,最后再写业务逻辑以及接口的其他功能,每个人的方法可能不同,也就不详述了。

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

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

相关文章

Ajax

一、什么是Ajax <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

gitee-快速设置

快速设置— 如果你知道该怎么操作&#xff0c;直接使用下面的地址 HTTPS SSH: gitgitee.com:liuzl33078235/esp-idf.git 我们强烈建议所有的git仓库都有一个README, LICENSE, .gitignore文件 初始化 readme 文件 Git入门&#xff1f;查看 帮助 , Visual Studio / TortoiseG…

mysql实际调优

一般实际调优的情况就不需要去考虑mysql数据库结构或者命名优化那些。做这些优化是大动作&#xff0c;也不是咱们一般人去接触到的。 所以我们针对mysql的调优其实大部分还是针对索引进行优化。 我们刚接触这个表的话可以先查询当前表中所有的索引 使用 SHOW INDEX FROM yo…

Selenium —— 网页frame与多窗口处理!

一、多窗口处理. 1.1、多窗口简介 点击某些链接&#xff0c;会重新打开⼀个窗⼜&#xff0c;对于这种情况&#xff0c;想在新页⾯上操作&#xff0c;就 得先切换窗⼜了。 获取窗⼜的唯⼀标识⽤句柄表⽰&#xff0c;所以只需要切换句柄&#xff0c;就可以在多个页⾯灵 活操作了…

大数据之Kafka

Kafka概述 传统定义&#xff1a;一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 最新定义&#xff1a;一个开源的分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。最主要的功能是做数据的…

一表总结前端axios传参与后端springboot接收

方法参数形式后端示例注意get,deleteurl中拼接(RestFul风格&#xff09;PathVariable url: /test ‘/’ name ‘/’ age, GetMapping("/test/{name}/{age}") public Result find( PathVariable("name") String name, PathVari…

深耕能源+政务 | 云畅科技入选中国信通院2023低代码无代码产业图谱

由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信标准化协会联合主办的2023数字化转型发展大会暨首届数字原生大会于9月13-14日在北京举办&#xff0c;“2023低代码无代码产业图谱”正式发布&#xff01; 01 2023年&#xff0c;中共中央、国务院…

北斗卫星导航系统:引领现代林业发展的先锋

北斗卫星导航系统&#xff1a;引领现代林业发展的先锋 随着人类社会的发展&#xff0c;林业作为生态环境保护和经济发展的重要组成部分&#xff0c;也在不断向前发展。为了更好地管理和保护森林资源&#xff0c;我们必须寻求一种新的方式来提高林业管理的效率。而北斗技术的应用…

SpringBoot的excel模板导出

Word的模板导出(参考&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/fill) 创建有两个sheet的excel文件模板 将模板文件放入resource\templates/doc下使用 public void exportUavInfoExcel(HttpServletResponse response, CaseExportRPO cas…

如何去开展软件测试工作

1. 软件测试 在一般的项目中&#xff0c;一开始均为手动测试&#xff0c;由于自动化测试前期投入较大&#xff0c;一般要软件项目达到一定的规模&#xff0c;更新频次和质量均有一定要求时才会上自动化测试或软件测试。 1.1. 项目中每个成员的测试职责 软件测试从来不是某一…

flink使用kryo支持自定义的序列化器

背景 这里所说的序列化器不是指实现TypeSerializer的状态序列化器&#xff0c;而是指flink在使用KryoSerializer序列化器时遇到kryo无法序列化的类型时&#xff0c;通过往kryo中注册某个序列化器类来让kryo可以序列化某个类的实例&#xff0c;所以这里严格意义上应该是说&…

TypeScript学习记录

一、TS开发环境的搭建 1、下载并安装node.js 2、使用npm全局安装typeScript 进入命令行输入&#xff1a;npm i -g typescript 3、创建一个ts文件 4、使用tsc对ts文件进行编译 进入命令行进入ts文件所在目录执行命令&#xff1a;tsc 文件名.ts 二、TS基本变量 1、类型声…

ChatGPT:使用FastJSON库关闭JSON引用检测的方法

ChatGPT&#xff1a;使用FastJSON库关闭JSON引用检测的方法 下面我将输入一个方法&#xff0c;请你记住&#xff1a; ChatGPT&#xff1a; 好的&#xff0c;请输入方法。 RequestMapping("/getLianZhengLabels") public String getLianZhengLabels() {HashMap<St…

Kubernetes(K8s):未来云原生应用的引擎

文章目录 Kubernetes的核心概念和架构为什么K8s是构建云原生应用的首选工具&#xff1f;云原生应用的好处和挑战容器编排的重要性&#xff1a;Docker和KubernetesKubernetes生态系统&#xff1a;核心组件和附加工具实际应用&#xff1a;企业如何在生产环境中使用K8s未来展望&am…

rust trait对象

在拥有继承的语言中&#xff0c;可以定义一个名为shape的基类&#xff0c;该类上有一个draw方法。其他的类比如Button、SelectBox继承shape。它们各自覆盖draw方法。调用这些子类的draw方法时&#xff0c;就可以把它们统一当作shape来使用。不过Rust并没有继承&#xff0c;如果…

做一个贪吃蛇小游戏happy一下

直接Vue上代码 <template><div><div>贪吃蛇</div><canvas id"canvas" width"400" height"400"></canvas></div> </template><script> export default {data() {return {ctx: null,inter…

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…

结构型设计模式——组合模式

摘要 组合模式(composite pattern): 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方式处理个别对象以及对象组合。 一、组合模式的意图 将对象组合成树形结构来表示“整体/部分”层次关系&#xff0c;允许用户以相同的方式处理单独…

AVL Cruise 2020.1 安装教程

文章目录 安装包安装破解 安装包 链接&#xff1a;https://pan.baidu.com/s/1GxbeDj_SyvKFyPeTsstvTQ?pwd6666 提取码&#xff1a;6666 安装 安装文件&#xff1a; 双击setup.exe&#xff1a; 一直netx&#xff0c;中间要修改两次路径&#xff0c;第一次是安装位置&#xf…

Flume最简单使用

文章目录 一、简介1、定义2、基础架构 二、快速入门1、解压Flume2、案例一&#xff1a;监控端口号3、案例二&#xff1a;将空目录下文件 三、Flume进阶1、Flume事务2、Flume Agent内部原理3、案例一&#xff1a;监控日志4、案例二&#xff1a;多路复用和拦截器适应4.1 原理4.2 …