Django系列:Django简介与MTV架构体系概述

Django系列 Django简介与MTV架构体系概述


作者李俊才 (jcLee95)https://blog.csdn.net/qq_28550263
邮箱 : 291148484@163.com
本文地址https://blog.csdn.net/qq_28550263/article/details/132890054


【介绍】:Django简介与MTV架构体系概述。
下一节:《 Django开发环境配置


目 录



[1. 概述](#1. 概述)

[1.1 为什么想写Django](#1.1 为什么想写Django)

记得2019年时初学Django,这也是我学习的第一个Web后端框架,也是至今为止我最喜欢的一个。19年时,当时发的第一篇博客就是关于Django中如何解决跨域问题的总结。近几年做过很多不同领域的项目,包括前端、桌面端、移动端的应用开发,应用开发中都会设计到一个共同的问题,就是数据从哪里来。

在软件应用开发中,关于数据的处理可以分成两大领域,一个是领域是处理内存中的数据,我们称之为状态管理;另一个领域是数据的持久化。当然,如果你说我做的时一个本地应用,比如单机游戏、计算器使用程序,等等,他们所涉及的数据处理往往集中与状态管理,以及简单的本地存储。但是如果你做的应用是一个网络应用,则一般不可避免要使用数据库,尤其是基于客户端-服务器体系的软件模式。

在网络应用中,数据的来源和管理变得更加复杂。这时候,我们需要一个强大的后端框架来帮助我们处理各种数据操作,包括接收、存储、检索和传输数据。这正是Django的用武之地。

Django是一个高度可定制的Python后端框架,它提供了丰富的功能和工具,用于处理与数据相关的所有任务。不管你是构建社交媒体平台、电子商务网站、博客、在线学习平台还是任何其他类型的Web应用,Django都可以成为你的得力助手。

在前后端分离的开发体系中,后端的作用至关重要。它充当着数据的守护者和处理者,负责接受前端发送的请求,处理这些请求,并将响应返回给前端。这种分离的开发模式使前端工程师和后端工程师能够独立开发各自的部分,从而提高了开发效率和代码的可维护性。

[1.2 Django框架的优缺点](#1.2 Django框架的优缺点)

Django的优势在于其强大的数据处理能力。它提供了内置的数据库支持,你可以选择使用不同的数据库后端(如SQLite、MySQL、PostgreSQL等),根据项目的需求进行配置。Django的ORM(对象关系映射)让你可以使用Python类来表示数据库中的表格和关系,而不需要编写复杂的SQL查询语句。这简化了数据持久化的过程,并提高了代码的可读性。

此外,Django还提供了许多其他功能,如用户认证、安全性、缓存管理、国际化等,使开发者能够专注于业务逻辑而不必担心底层的技术细节。

总结起来,Django框架具体有以下优点。

概述 描述
完整的开发框架 Django提供了一个完整的开发框架,包括ORM(对象关系映射)、认证、管理后台、表单处理、国际化等功能。这意味着你可以更专注于业务逻辑,而不必从头构建这些常见的功能。
高度可定制 虽然Django提供了很多内置功能,但它也允许开发者高度定制应用程序。你可以轻松地根据项目需求添加自定义模型、视图、中间件等。
强大的社区支持 Django拥有一个庞大的活跃社区,这意味着你可以找到大量的文档、教程、第三方库和插件,以及得到问题的快速解答。
安全性 Django有内置的安全性功能,包括防止SQL注入、跨站点脚本攻击(XSS)、跨站点请求伪造(CSRF)等。这些功能有助于保护应用程序免受常见的Web安全漏洞。
ORM(对象关系映射) Django的ORM允许你使用Python类来表示数据库模型,而不需要编写SQL语句。这简化了数据持久化的过程,提高了代码的可读性和可维护性。
丰富的第三方库 Django生态系统中有许多第三方库和插件,可以扩展其功能,例如Django REST framework用于构建RESTful API,Django CMS用于内容管理等。

同时也必须要指出,作为一款重型Web框架,他虽然提供了强大丰富的功能,但也有显而易见的一些缺点。

概述 描述
学习曲线 对于初学者来说,Django的学习曲线可能相对陡峭。尤其是对于那些没有经验的开发者,需要一些时间来理解框架的各个方面。
过于重量 虽然Django的完整性是其优点之一,但对于一些小型项目来说,它可能显得过于重量级。对于一些特定需求的微服务项目,选择更轻量级的框架可能更合适。
不适合实时应用 Django在处理实时应用和长连接方面表现不佳。如果你的项目需要大规模实时数据处理,可能需要考虑其他框架或技术栈。
某些功能需要第三方库 尽管Django提供了很多功能,但某些高级功能可能需要依赖第三方库。这可能会导致项目的复杂性增加,需要额外的配置和集成工作。

接下来,本文将探讨如何配置Django的开发环境,以便你能够开始编写和测试自己的Web应用程序。在进行这一步之前,请确保你已经安装了Python,因为Django是一个基于Python的框架。

[2. MTV架构](#2. MTV架构)

[2.1 概述](#2.1 概述)

2.1.1 是什么 MTV

Django的MTV架构是其成功的关键之一,它将应用程序的不同方面明确定义并分离开来,从而提供了一个强大而有组织的开发框架。

MTV 代表了 Model -Template -View,是Django框架的核心设计理念之一,它有助于将应用程序的不同组成部分分离开来,以提高代码的可维护性和可扩展性。

2.1.2 MTV 与 MVC的关系

广义上看,Django的MTV也属于MVC体系。在传统的MVC模式中,有三个主要组件:
Model(模型) : 负责表示和管理应用程序的数据。
View(视图) : 负责用户界面的呈现,将数据从模型传递到用户界面。
Controller(控制器) : 负责接受用户输入,处理业务逻辑,并调用模型和视图来执行相应的操作。

MVC模式的关键思想是将应用程序分为 数据用户界面控制逻辑 三个独立的组件。

实际上,Django中也是如此,只不过它在术语和组织上有所不同:

Model(模型) : 与MVC中的模型类似,负责表示和管理应用程序的数据。模型定义了数据库结构和数据之间的关系。
Template(模板) : 与MVC中的视图(View)类似,但在Django中,模板用于呈现用户界面。它包含了 HTML 和 Django 模板语言的标记,用于渲染页面并显示数据。不过需要指出是,在如今的实际开发中,都采用前后端分离的体系,因此Template基本上是不怎么使用的(仅限于后端自己玩玩即可),前端框架如Vue、React等都有自己的模板语法,如React中使用的JSX/TSX,Vue中的单文件组件及其各种模板语法,开发效率都远远高于后端框架,毕竟后端的模板本质上都是拼凑和处理html、js、css字符串。
View(视图): 与MVC中的控制器(Controller)类似,但在Django中,视图负责接受HTTP请求,处理业务逻辑,然后使用模型和模板来生成HTTP响应。

之所以这样组术语,因为Django希望强调它的几大主要功能,比如说它的其功能强大的模板层,提供了 开箱即用模板语法。事实上,在Django中多数功能都是开箱即用的,这在后续文章的详细介绍中将会看到。

接下来,本节将分别介绍绍Django的MTV架构中的每个组成部分。

[2.2 Model(数据模型层)](#2.2 Model(数据模型层))

模型是Django应用程序的数据存储部分。它定义了应用程序的数据结构,包括数据库表格、字段以及表格之间的关系。

模型通常由Python类表示,这些类继承自Django的模型基类。每个模型类代表了一个数据库表格。使用模型类,你可以定义数据的结构、验证规则、关系和数据库查询方法。Django的ORM(对象关系映射)允许你通过Python代码来操作数据库,而不需要直接编写SQL语句。

当使用Django开发Web应用程序时,模型(Model)是数据层的核心组件,它提供了一种高级、Pythonic 的方式来管理应用程序的数据。下面我们将初步从不同角度体验一下Django的Model层。

数据结构定义

在Django中,每个模型类代表了应用程序中的一个数据结构,通常对应数据库中的表格。这些模型类是Python类,它们定义了表格的字段和字段的数据类型。例如,你可以创建一个模型类来表示用户(User):

python 复制代码
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    date_joined = models.DateTimeField(auto_now_add=True)

这个模型定义了一个名为 User 的数据结构,包括了用户名(username)、电子邮件(email)和注册日期(date_joined)等字段。

验证规则

Django模型允许你定义字段的验证规则,以确保数据的完整性和一致性。例如,你可以要求电子邮件字段的值必须是有效的电子邮件地址,并且用户名字段的长度不得超过一定限制。这些验证规则可以在模型类中以参数的形式定义。

数据表之间的关系

在现实世界的应用程序中,数据之间通常存在复杂的关系。Django模型允许你定义不同表格之间的关系,如 一对多多对一多对多 关系。这些关系可以通过 字段 来表示,如 ForeignKeyManyToManyField

例如,如果你的应用程序需要表示用户和他们的文章之间的关系,可以使用 ForeignKey 字段:

python 复制代码
class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

这里的author字段是一个外键,它建立了Article模型和User模型之间的关系,表示每篇文章都有一个作者,作者是一个User对象。

数据库查询方法

Django的 ORM 允许你通过Python代码进行数据库查询,而不需要编写原生的SQL语句。你可以使用模型类的方法来执行常见的查询操作,如过滤、排序、聚合等。这使得数据的检索和操作变得更加容易和可读。

例如,你可以使用以下代码来获取所有用户名以字母顺序排列的用户:

python 复制代码
users = User.objects.order_by('username')

这里的User.objects是一个查询集(QuerySet),它允许你链式调用多个查询方法,以便构建复杂的查询。

数据库迁移

Django的模型还包括一个重要功能,即数据库迁移。它可以自动检测模型类的变化,并生成相应的数据库迁移文件,以便你可以轻松地将数据库模式更新到最新版本,而无需手动编写SQL迁移脚本。

例如,当你添加一个新的字段或修改字段的属性时,Django可以生成迁移文件,然后你可以运行迁移命令来更新数据库:

bash 复制代码
python manage.py makemigrations  # 生成迁移文件
python manage.py migrate         # 应用迁移以更新数据库

总而言之,Django的模型提供了一个强大的工具,用于定义数据结构、验证数据、建立数据之间的关系,并且可以通过Python代码进行数据库查询。这种高级的ORM能力大大简化了数据层的开发和维护,同时提高了代码的可读性和可维护性。

[2.3 View(视图层)](#2.3 View(视图层))

Django视图层是Django应用程序的逻辑处理部分。它接收来自用户的HTTP请求,执行相应的操作,然后返回HTTP响应。视图层通常是Python函数(基于函数的视图)或类(基于类的视图),它们处理URL映射和请求处理逻辑。每个视图函数接收HTTP请求,执行必要的数据处理,然后通过模板生成响应。

视图层的任务包括从数据库中检索数据、对数据进行操作、验证用户身份、渲染模板以及返回HTTP响应。Django的URL映射机制将不同的URL路由到相应的视图函数。

视图函数和视图类

视图层通常由Python函数或类组成,它们被称为视图函数或视图类。

基于函数的视图(Function-Based Views)

这是最常见且简单的形式,其中视图是一个Python函数,接收HTTP请求作为参数,并返回HTTP响应。例如:

py 复制代码
from django.http import HttpResponse

def my_view(request):
    # 处理请求的逻辑
    return HttpResponse("Hello, World!")

基于类的视图(Class-Based Views)

这是一种更高级的方式,它允许你使用类来组织视图逻辑,每个类的方法对应于不同的HTTP请求方法(如GET、POST)。这提供了更好的代码组织和可重用性。例如:

py 复制代码
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # 处理GET请求的逻辑
        return HttpResponse("Hello, World!")

URL映射

Django的URL映射机制将不同的URL路由到相应的视图函数或视图类。通过在Django应用程序的URL配置中定义URL模式(URL patterns),你可以将特定的URL路径映射到特定的视图。这允许你组织和管理应用程序的URL结构。

请求和响应处理

DjangoURL 映射机制将不同的URL路由到相应的视图函数或视图类。

通过在 Django 应用程序的URL配置中定义 URL模板 (URL patterns),你可以将特定的 URL 路径映射到特定的视图。这允许你组织和管理应用程序的 URL 结构。

HTTP响应

视图函数或视图类的最终任务是返回 HTTP响应对象 。HTTP响应包含了要发送回客户端的内容,如HTML内容、JSON数据等。

通常,你可以使用Django提供的 HttpResponse类 来创建响应对象,或者使用更高级的响应类来处理不同的情况,如JsonResponseHttpResponseRedirect 等。

其中,HttpResponse 类用于创建基本的 HTTP 响应对象,通常用于返回 HTML 内容;JsonResponse 类用于创建包含 JSON 数据的 HTTP 响应对象。这在构建 API 或需要返回结构化数据的情况下非常有用;而HttpResponseRedirect 类用于重定向用户到另一个URL。这在处理表单提交后通常用于将用户重定向到成功页面或其他页面。

[2.4 Template(模板层)](#2.4 Template(模板层))

Django模板层是Django应用程序的用户界面部分。它定义了应用程序的前端布局和显示方式。模板层中通常是HTML文件,但其中可以包含Django模板语言的标记和逻辑。Django模板语言允许你嵌入动态数据和逻辑控制,以便在渲染时生成具体的HTML内容。使用模板,你可以将数据从后端传递到前端,以便在浏览器中呈现给用户。模板层的重要任务是将数据和用户界面有效地结合起来。

虽然Django中提供了强大的模板语法功能,但是在前后端分离的大环境下,很多情况下我们并不怎么使用它。事实上,是否使用模板语法,理解和评价Django的模板语法以及前后端分离的实践,是一个重要的话题,它取决于不同方面的考量。读者可以参考下面的不同角度决定是否需要使用Django的模板层。

1. 模板语法的优点

项目 描述
快速原型设计 模板语法允许后端开发人员快速创建原型并生成基本的前端界面,这在项目早期或需要快速迭代的情况下可能很有价值。对于一些简单的页面,使用模板语法可能更加高效
简化小规模项目 对于小规模项目或内部工具,Django的模板语法可以提供足够的功能,无需引入复杂的前端框架。这可以减少项目的复杂性和维护成本
无需前端开发人员 一些项目可能没有专门的前端开发人员或资源。在这种情况下,后端开发人员可以使用模板语法来处理整个应用程序的用户界面

2. 前后端分离的优势

项目 描述
分工合作 前后端分离允许前端和后端开发人员专注于各自的领域。前端开发人员可以更好地处理用户界面的复杂性,而后端开发人员可以专注于业务逻辑和数据处理
更好的性能 前后端分离允许前端应用程序与后端API分离运行,这有助于提高应用程序的性能和加载速度。前端应用程序可以被缓存,并且可以独立扩展和优化
灵活性和创新 使用现代前端框架如React、Vue等,开发人员可以更轻松地实现复杂的用户交互和动画效果。这些框架提供了更多的灵活性和创新空间

3. Django模板使用场景

项目 描述
适用于小型项目和原型 Django模板语法在小型项目、原型设计或内部工具开发中可能仍然有用。这些情况下,可以快速构建简单的用户界面而无需引入前端框架
前后端分离对大型应用更合适 对于大型应用、高性能要求、复杂交互和多平台支持等场景,前后端分离通常更合适。现代前端框架提供了更多的工具和性能优势

4. 其它建议

  • 混合使用: 在一些项目中,混合使用Django的模板语法和前端框架可以是一个有效的策略。你可以选择性地使用Django渲染部分页面,而使用前端框架构建复杂的单页应用。
  • 根据需求选择: 最终,选择是否使用Django的模板语法或前后端分离取决于项目需求、团队技能和时间预算。在选择时应权衡各自的优缺点。

总的来说,Django的模板语法具有一些优点,比如在小型项目和原型设计中,但前后端分离的做法在大型应用和复杂用户界面方面更具竞争力。开发团队应根据具体项目需求和资源来做出决策,并根据情况选择使用何种技术和工具。

[3. 学习Django的建议](#3. 学习Django的建议)

3.1 开始学习Django

Django是基于Python的Web框架,所以首先需要熟悉Python编程语言。Django官方文档是学习Django的最佳资源之一。开始时,阅读官方教程是一个很好的起点。官方文档还提供了详细的参考资料,涵盖了Django的每个方面。

Django官方网站地址为:https://docs.djangoproject.com/,你可以在Document标签页阅读其文档:https://docs.djangoproject.com/en/4.2/intro/overview/

一旦你理解了Django的基础概念,尝试构建一些小型项目来实践你的知识。这有助于你熟悉Django的工作流程。

3.2 关于 Django 文档

Django的官方文档分为以下几个部分,可以参考查询相应的页面。

1. 入门

  • From scratch(从零开始): 适用于初学Django或编程的人。这是你开始的地方,提供了有关Django的概览和安装的信息。

  • Tutorial(教程): 分为多个部分,通过一系列步骤引导你创建一个Web应用程序。教程包括请求和响应、模型和管理站点、视图和模板、表单和通用视图、测试、静态文件、自定义管理站点以及添加第三方包等主题。

  • Advanced Tutorials(高级教程): 包括如何编写可重用应用程序以及编写Django的第一个补丁的信息。

2.模型层

  • Models(模型): 介绍了Django提供的数据结构化和操作的抽象层,包括模型、字段类型、索引、元选项和模型类。

  • QuerySets(查询集): 学习如何使用查询集进行数据库查询,包括查询方法参考和查找表达式。

  • Model instances(模型实例): 讲解了如何访问相关对象和实例方法。

  • Migrations(迁移): 介绍了Django的迁移系统,包括迁移概述、操作参考、模式编辑器和编写迁移。

  • Advanced(高级): 涵盖了管理器、原始SQL、事务、聚合、搜索、自定义字段、多数据库、自定义查找、查询表达式、条件表达式和数据库函数等高级主题。

  • Other(其他): 包括支持的数据库、遗留数据库、提供初始数据、优化数据库访问以及特定于PostgreSQL的功能等信息。

3.视图层

  • 基础知识: 学习有关视图的基础知识,包括URL配置、视图函数、快捷方式、装饰器和异步支持。

  • 参考: 包括内置视图、请求/响应对象和模板响应对象的参考。

  • 文件上传: 了解文件上传的概述、文件对象、存储API、文件管理以及自定义存储。

  • 基于类的视图: 概述了基于类的视图,包括内置显示视图、内置编辑视图、使用混合、API参考以及扁平索引。

  • 高级: 包括生成CSV和生成PDF等高级主题。

  • 中间件: 包括中间件概述和内置中间件类。

4.模板层

  • 基础知识: 介绍了模板层的概述。

  • **针对设计师:** 提供了设计师友好的语法概述、内置标签和过滤器以及人性化方面的信息。

  • **针对程序员:** 包括模板API、自定义标签和过滤器以及自定义模板后端方面的信息。

5.表单

6.开发过程

、ASGI服务器、部署静态文件、通过电子邮件跟踪代码错误以及部署检查表等信息。

7.管理界面

8.安全性

9.国际化和本地化

  • 概述: 介绍了Django提供的强大的国际化和本地化框架,以帮助你开发多语言和多地区的应用程序。

  • 时区: 学习关于时区的信息。

10.性能和优化

  • 性能和优化概述: 包括一系列可帮助你提高代码运行效率、减少系统资源使用的技术和工具。

11.地理框架

  • GeoDjango: 旨在成为一款世界级的地理Web框架,目标是尽可能地简化GIS Web应用程序的构建,以及利用具备空间功能的数据的强大功能。

12.常见Web应用程序工具

13.其他核心功能

14.Django开源项目

  • 社区: 学习如何参与Django项目以及如何贡献,包括发布流程、团队组织、Django源代码存储库、安全策略以及邮件列表和论坛。

  • 设计理念: 了解Django项目的设计理念。

  • 文档: 关于本文档的信息。

  • 第三方分发: 包括第三方分发的信息。

  • Django的发展历程: 学习Django的API稳定性、发布说明和升级说明以及弃用时间表等信息。

相关推荐
中草药z19 分钟前
【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)
java·数据库·spring boot·spring·bean·源码阅读
地球资源数据云21 分钟前
全国30米分辨率逐年植被覆盖度(FVC)数据集
大数据·运维·服务器·数据库·均值算法
Ahern_1 小时前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒1 小时前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao2 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
破 风2 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
Rverdoser2 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
好学近乎知o2 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
m0_748233642 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql
dowhileprogramming2 小时前
Python 中的迭代器
linux·数据库·python