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




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


1. 概述

1.1 为什么想写Django

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

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

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

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

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

1.2 Django框架的优缺点

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

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

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

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

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

2. MTV架构

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(数据模型层)

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

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

数据结构定义

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

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 字段:

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语句。你可以使用模型类的方法来执行常见的查询操作,如过滤、排序、聚合等。这使得数据的检索和操作变得更加容易和可读。

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

users = User.objects.order_by('username')

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

数据库迁移

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

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

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

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

2.3 View(视图层)

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

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

视图函数和视图类

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

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

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

from django.http import HttpResponse

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

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

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

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(模板层)

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

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

1. 模板语法的优点

2. 前后端分离的优势

3. Django模板使用场景

4. 其它建议

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

总的来说,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.管理界面

  • 管理站点: 查找有关自动化管理界面的所有信息,这是Django中最受欢迎的功能之一。

  • 管理操作: 学习有关管理操作的信息。

  • 包括有关管理文档生成器的信息。

8.安全性

9.国际化和本地化

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

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

10.性能和优化

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

11.地理框架

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

12.常见Web应用程序工具

13.其他核心功能

14.Django开源项目

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

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

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

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

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

09-15 05:03