七爪源码:Django REST 框架的架构
ccwgpt 2024-10-31 12:33 23 浏览 0 评论
简介 - 什么是 Django REST 框架 (DRF)?
Django 是一个用于在 Python 中创建 Web 应用程序的框架。 虽然 Django 提供了很多功能,但构建 REST API 需要您自己实现它。
那时 Django REST Framework (DRF) 出现了,这是一个第三方 Django 包,专门用于在 Django 中开发 REST API。 默认情况下,它具有提供 REST API 所需的所有功能,并充当扩展包,扩展了有用的功能。
在实际项目中,您将使用 Django 来实现 Web 应用程序的基本功能,并使用 DRF 来实现 REST API 特定的功能。
什么是 REST API?
DRF 擅长基于 REST 原则设计 Web API。
REST (Representational State Transfer) 是用于定义 Web API 的架构之一。 HTTP 协议标准的主要作者之一 Roy Fielding 于 2000 年在 Web 上的一篇博士论文中首次使用了该术语,并从那时起在网络圈子中迅速使用。
REST 理论上兼容所有协议和数据格式,但大多数使用 HTTP 并使用 JSON(JavaScript Object Notation)传输数据。其灵活性、速度和简单性使 REST 成为在 Web 上检索数据的最常用选择。
直到 2000 年,由 Microsoft 开发的简单对象访问协议 (SOAP) 是最广泛使用的客户端-服务器交互平台。但是,该协议存在以下两个问题:
- 它要求用户遵守有关如何与服务器交互的严格规则
- 它依赖于 XML。
为了解决 SOAP 被普遍用作网络通信的常规标准的问题,提出了一种称为 REST 的体系结构。今天,REST 是最流行的 API 之一,并已被大型全球公司(主要是 GAFA)采用为 Web 提供商。
REST 特性 - DRF 的案例
与所有其他 API 一样,REST API 允许在用户和应用程序之间移动数据。例如,每次用户登录网站或访问智能手机上的应用程序时,API 都支持客户端和主机服务器之间的通信。 REST API 充当中介,将来自用户的请求传递到服务器并从服务器返回响应。
在 DRF 中,REST API 可用于松散耦合或分离 Web 应用程序的后端和前端。此外,通过分离后端和前端,可以享受各种优势。更具体地说,通过将作为 Django 弱点的前端委托给 React 等 JavaScript 框架,您可以实现高质量的 UI(用户界面)和 UX(用户体验)。通过利用 JavaScript 框架,还可以进行 SPA(单页应用程序)开发。
DRF最大的优点是可以分前端和后端开发。
DRF 结构和问题
Django 是一个框架,旨在在单个项目中拥有多个应用程序,每个应用程序都有自己的 MVT(模型、视图、模板)。在 DRF 中,模板被序列化器移除并替换。
DRF 的简化架构由以下三个文件组成:
- views.py:一个类,作为执行 REST API 的逻辑入口点,相当于 Ruby on Rails 中 API 的 Controller。
- serializers.py:它为每个 API 转换请求参数和模型。它还提供验证以确保参数与模型匹配。
- models.py:相当于 ORM(对象关系映射)。
在实际的 Web 服务中,很少只对单个表进行 CRUD 处理,因为逻辑处理是基于一些业务知识、规则或执行 REST API 时的判断。但是,如果您在不了解此类架构的情况下开始实施,您会发现自己陷入困境。
以下是DRF结构及其问题的简要说明。
问题 1:视图可能变得过于复杂
这就是在视图中写太多逻辑的问题,也就是所谓的胖控制器。这是不熟悉架构的初学者往往会遇到的问题。
在 DRF 中,在一个简单的应用程序中实现 CRUD 处理没有问题,如下所示。
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=10)
pub_date = models.DateTimeField('date published')
from .models import Question
from rest_framework import serializers
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = '__all__'
from rest_framework import viewsets
from .models import Question
from .serializers import QuestionSerializer
class QuestionViewSet(viewsets.ModelViewSet):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
'''
No need to create a method in particular because the ModelViewSet
from which it is inherited defines a function that serves
as the API for CRUD processing.
'''
在 DRF 端提供和隐藏 CRUD 处理。因此,在views.py中编写通常很容易,例如在保存数据时必须合并逻辑时。
问题 2:业务知识很容易分散在序列化器和模型之间
由于序列化器提供了验证,因此出现的问题是很难知道在哪里实现对值的上限和下限、字符串格式等的验证。
如果逻辑的设计方式是提供验证并因此在序列化器中实现,那么序列化器将承担多重责任。如果逻辑是在模型中实现的,那么序列化器验证的意义就丧失了。
解决方案
上述问题的解决方法如下(简述执行REST API时的行为)
执行 GET 时,按原样使用 DRF 提供的功能;当使用来自非 Django 资源的数据时,在序列化器端将其定义为 SerializerMethodField 等。
如果在执行除 GET 之外的任何方法时没有任何逻辑,请使用 Aggregate 或 DomainObject 来验证序列化程序的 validate() 函数中的值。
如果在执行除 GET 之外的任何方法时存在逻辑,则视图会将序列化程序中的数据字典作为参数传递给 application_services。然后,application_services 根据 dict 参数生成一个 Aggregate 并对其进行处理。要从数据库中的数据生成聚合,使用 IXXXReader。存储数据时,根据dict参数生成一个Aggregate,传给IXXXWriter进行存储。最后,使用序列化程序返回从 application_services 获得的字典作为响应。
概括
在本文中,我们彻底讨论了 Django REST 框架的架构、问题和解决方案。坦白说,DRF 的架构很简单,但是如果没有对架构有透彻的了解,开发应用程序应该会有问题。
我们希望本文能帮助您使用 Django REST Framework 进行高效开发。
关注七爪网,获取更多APP/小程序/网站源码资源!
相关推荐
- 迈向群体智能 | 智源发布首个跨本体具身大小脑协作框架
-
允中发自凹非寺量子位|公众号QbitAI3月29日,智源研究院在2025中关村论坛“未来人工智能先锋论坛”上发布首个跨本体具身大小脑协作框架RoboOS与开源具身大脑RoboBrain,可实...
- 大模型对接微信个人号,极空间部署AstrBot机器人,万事不求百度
-
「亲爱的粉丝朋友们好啊!今天熊猫又来介绍好玩有趣的Docker项目了,喜欢的记得点个关注哦!」引言前两天熊猫发过一篇关于如何在极空间部署AstrBot并对接QQ消息平台的文章,不过其实QQ现在已经很少...
- Seata,让分布式事务不再是难题!实战分享带你领略Seata的魅力!
-
终身学习、乐于分享、共同成长!前言Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的...
- 常见分布式事务解决方案(分布式事务解决的问题)
-
1.两阶段提交(2PC)原理:分为准备阶段(协调者询问参与者是否可提交)和提交阶段(协调者根据参与者反馈决定提交或回滚)。优点:强一致性,适用于数据库层(如XA协议)。缺点:同步阻塞:所有参与者阻塞...
- 分布式事务:从崩溃到高可用,程序员必须掌握的实战方案!
-
“支付成功,但订单状态未更新!”、“库存扣减后,交易却回滚了!”——如果你在分布式系统中踩过这些“天坑”,这篇文章就是你的救命稻草!本文将手把手拆解分布式事务的核心痛点和6大主流解决方案,用代码实战+...
- 谈谈对分布式事务的一点理解和解决方案
-
分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下:项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要...
- 一篇教你通过Seata解决分布式事务问题
-
1 Seata介绍Seata是由阿里中间件团队发起的开源分布式事务框架项目,依赖支持本地ACID事务的关系型数据库,可以高效并且对业务0侵入的方式解决微服务场景下面临的分布式事务问题,目前提供AT...
- Seata分布式事务详解(原理流程及4种模式)
-
Seata分布式事务是SpringCloudAlibaba的核心组件,也是构建分布式的基石,下面我就全面来详解Seata@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合...
- 分布式事务最终一致性解决方案有哪些?MQ、TCC、saga如何实现?
-
JTA方案适用于单体架构多数据源时实现分布式事务,但对于微服务间的分布式事务就无能为力了,我们需要使用其他的方案实现分布式事务。1、本地消息表本地消息表的核心思想是将分布式事务拆分成本地事务进行处理...
- 彻底掌握分布式事务2PC、3PC模型(分布式事务视频教程)
-
原文:https://mp.weixin.qq.com/s/_zhntxv07GEz9ktAKuj70Q作者:马龙台工作中使用最多的是本地事务,但是在对单一项目拆分为SOA、微服务之后,就会牵扯出分...
- Seata分布式事务框架关于Annotation的SAGA模式分析
-
SAGAAnnotation是ApacheSeata版本2.3.0中引入的功能,它提供了一种使用Java注解而不是传统的JSON配置或编程API来实现SAGA事务模式的声明...
- 分布式事务,原理简单,写起来全是坑
-
今天我们就一起来看下另一种模式,XA模式!其实我觉得seata中的四种不同的分布式事务模式,学完AT、TCC以及XA就够了,Saga不好玩,而且长事务本身就有很多问题,也不推荐使用。S...
- 内存空间节约利器redis的bitmap(位图)应用场景有哪些你知道吗
-
在前面我们分享过一次Redis常用数据结构和使用场景,文章对Redis基本使用做了一个简单的API说明,但是对于其中String类型中的bitmap(位图)我们需要重点说明一下,因为他的作用真的不容忽...
- 分布式事务原理详解(图文全面总结)
-
分布式事务是非常核心的分布式系统,也是大厂经常考察对象,下面我就重点详解分布式事务及原理实现@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc分布式事务分布式事务指的是...
- 大家平时天天说的分布式系统到底是什么东西?
-
目录从单块系统说起团队越来越大,业务越来越复杂分布式出现:庞大系统分而治之分布式系统所带来的技术问题一句话总结:什么是分布式系统设计和开发经验补充说明:中间件系统及大数据系统前言现在有很多Java技术...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)