从0到1搭建个人博客-Django(三)

2023-10-27

你好,我是goldsunC

让我们一起进步吧!

从0到1搭建个人博客-Django(三)

在以下链接快速回顾系列文章内容

从0到1搭建个人博客-Django(一)
从0到1搭建个人博客-Django(二)

本篇内容主要是一些框架概念性的东西,需要理解,建议如果没基础的话多读几遍。

MVC设计模式

说到MVC,它可是Web设计模式的经典制作,我们前文说过Django是遵循MVC模式的,而实际上,Django实际使用的是MTV框架,MTV是从MVC上衍生而来的。不管MVC还是MTV,它们究竟是什么呢?下文将给出介绍。

MVC是三个单词的缩写,分别为:模型(Model)视图(View)控制器(Controller)。MVC模式的主要目的就是实现Web系统的职能分工

其中:

  • Model层负责实现系统中的业务逻辑。

  • View层负责与用户的界面交互。

  • Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图(View)显示。同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

MVC模式的组成结构如图所示:

在这里插入图片描述

MVC设计模式强制性的使得应用程序的输入处理输出分开。使得MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

模型:模型表示企业数据和业务规则。在MVC的三个核心部件中,模型一般拥有最多的处理任务。例如它可能用像EJBsColdFusion Componments这样的构件对象来处理数据库。被模型返回的数据是中立的,也就是说模型与数据格式无关,这样使得一个模型能够为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

视图:视图是用户看到并与之交互的界面。简单来说你用HTML写成的页面就是属于视图负责的范围。当然视图还包括Macromedia FlashXHTMLXML/XSLWML等一些标识语言和Web Services

控制器:控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身并不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

实际应用中一个MVC设计模式简单的请求与响应过程如下:

在这里插入图片描述

首先客户端向服务器发送request请求Controller层接受请求,然后向ViewModel层发送指令。

View层接收到Controller发送过来的指令后,选择并加载用户请求的页面,并将此页面发送给Controller层。

Model层接收到指令后与数据库进行交互并选择相应的业务数据,然后将数据发送给Controller层。

之后Controller层将ModelView层返回的数据数组织成响应格式发送给浏览器,浏览器解析后将页面展示出来。

MVC的3层之间紧密相连,但是却相互独立,每一层的修改都不会影响其它层,每一层都提供了各自独立的接口供其它层调用,这样的设计模式降低了代码之间的耦合性,增加了模块的可重用性

MVC设计模式的优点

  1. 低耦合性

视图层和业务层分离,这样就允许只更改视图层代码而不用重新编译模型和控制器代码,同样如果一个应用的业务流程或者业务规则发生改变则只需要改动模型层。

  1. 高可重用性和可适用性

如今,我们可以通过很多方式来访问应用程序。如你可以使用电脑、手机或者Pad访问同一个服务器,虽然展示的页面不大一样,但是如果你做某项操作之后再服务器端产生的效果是一样的。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码。这是因为模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。而实现这些不同的界面只需要改变视图层的实现方式,控制器层和模型层无需做任何改变。

  1. 较低的生命周期成本

MVC使得开发和维护用户接口得技术含量降低。

  1. 快速部署

使用MVC模式可使开发时间得到相当大的缩减,它使程序员集中精力于业务逻辑,UI程序员集中精力于表现形式上。

  1. 可维护性

视图层和业务逻辑层分离使得Web应用程序更易于维护和修改。

  1. 利于工程化管理

因为不同层只负责各自具体的功能,每一个层不同的应用具有某些相同的特征,有利于通过工程和、工具化管理程序代码。

MVC设计模式的缺点

  1. 增加了系统结构的复杂性

如果你只想要开发一个简单的界面,完全遵循MVC模式使模型、视图和控制器分离,会增加结构的复杂性。

  1. 视图与控制器间过于紧密的连接

视图与控制器是相互分离又紧密联系的部件,视图没有控制器的存在,其应用很有限,控制器缺少视图,应用也很有限,这就妨碍了它们的独立重用。

  1. 视图对模型数据的低效率访问

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要访问将损失操作性能。

Django中的MTV

介绍完了MVC的一些概念,现在讲一讲Django的MTV。

在Django中,控制器接受用户输入的部分由框架自行处理。Django更关注的是模型(Model)模板(Template)视图(View),因此Django也被称为MTV框架。

简单的理解就是:Django将MVC中的View(视图)进一步分解成为了Django 视图(View)Django 模板(Template)

在Django中:

模型(Model):代表数据存取层,它负责处理与数据相关的所有事务如:如何存取数据、如何验证数据有效性、数据之间的关系等。

模板(Template):代表表现层,它负责处理与表现相关的决定例如:如何在页面或其他类型文档中进行显示。

视图(View):代表业务逻辑层,这一层包含存取模型及调取恰当模板的相关逻辑。可以把它看作模型与模板之间的桥梁。

DjangoMTV结构如图所示:

在这里插入图片描述

按照MVC模式进行分析,即在Django中用View层取代了Controller层的位置,用模板(Template)层取代了原来View层的位置。

在Django中你可能会把模板的视图混淆,但实际上Tempalte就是模板的意思,你可以理解为如一个HTML页面等。

数据库

数据库大家肯定都不陌生,它就是一个存储数据的地方。一个数据库往往由多个数据表构成。既然我们是做网站,那产生数据是必定的,因此我们需要给网站产生的数据找一个存储的地方。

还记得项目文件夹my_blog下我们测试服务器后产生的那个db.sqlite3文件吗?默认情况下,那个文件就算是我们的数据库了,网站产生的数据会存放在那里。

SQLite3数据库是在Python2.5+版本内置的,因此这个数据库不需要安装,能够直接使用。Django是默认支持SQLite3数据库的。当然,你也可以使用其它数据库如MySQL,但那个需要安装配置等,为了方便,我们现在使用SQLite3数据库,等项目完成你学会了Django的时候,换哪个数据库都是可以的。

数据模型

刚才介绍了我们的数据都存放在SQLite3数据库中,大家都知道操作数据库使用的是SQL语句,可能很多人会使用SQL,但也可能有些人不会。不过在Django中,你可以不用去直接操作数据库,只要定义好数据模型,然后用Python语句操作就可以了。也就是说你定义好了模型之后,其它的东西都会自动生成。这是为什么呢?这里就要介绍一下对象关系映射(Object Relational Mapping, ORM)了。

对象关系映射(ORM)

对象关系映射是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。Django的ORM位于框架的中心,介于数据模型(这个模型是继承自diango.db.models.Model类的子类)和基础关系数据库对象之间。

简单来讲就是ORM把底层关系数据库和Python的面向对象特质联系起来了。**每一个模型类映射对应的数据表,对模型的操作将直接反映到底层的数据表,即每一个类代表了一个表,每创建一个类的实例就相当于在表中增加了一行数据,每一个实例的属性代表了每一行数据的一列。**因此在定义好数据模型之后,通过映射到基础数据库中的Python对象,来创建、检索、更新以及删除数据库数据。这样我们修改数据就不用通过SQL语句了,直接用Python去修改对象的属性即可。

参考文献:

  1. https://www.dusaiphoto.com/article/2/
  2. https://docs.djangoproject.com/en/3.1/intro/
  3. http://c.biancheng.net/view/7288.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0到1搭建个人博客-Django(三) 的相关文章

  • 基于类的通用视图额外的上下文

    在基于类的视图之前 有一个可以在 urlsconf 中传递的 extra context 关键字 https docs djangoproject com en 1 3 topics generic views adding extra c
  • 如何检索分配给 Django 中的组的所有权限

    我正在执行一项任务来检索分配给 Django 中的组的一组权限 我可以使用以下代码获取创建的组 但无法使用它来获取分配给它们的权限 from django contrib auth models import Group Permissio
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何将 numpy rearray 的子集转换为连续数组?

    我有一个recarray来自读取 csv 文件 我有兴趣将列的子集转换为连续浮点数组 我想避免将它们转换为列表或将它们一一堆叠 我尝试了中的建议https stackoverflow com a 11792956 https stackov
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 将多索引转换为行式多维 NumPy 数组。

    假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http pandas pydata org pandas docs stable advanced html gt gt gt df 0 1 2 3 fir
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • Python sys.modules 包含尚未导入的模块

    我试图了解加载的模块与导入的模块之间的区别 如果有的话 我正在使用 Python 2 7 3 并且只是从命令行运行 Python 如果我执行 import sys sys modules 我得到一个列表 其中包括os 例如 文档说sys m
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • Django 将对象从视图传递到下一个进行处理

    如果您有 2 个视图 第一个视图使用 modelform 获取用户输入的信息 出生日期 姓名 电话号码等 第二个视图使用此信息创建表 如何将第一个视图中创建的对象传递到下一个视图 以便可以在第二个视图的模板中使用它 如果您能分享任何帮助 我
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 在不同的 GPU 上同时训练多个 keras/tensorflow 模型

    我想在 Jupyter Notebook 中同时在多个 GPU 上训练多个模型 我正在使用 4GPU 的节点上工作 我想将一个 GPU 分配给一个模型并同时训练 4 个不同的模型 现在 我通过 例如 为一台笔记本选择 GPU import
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1

随机推荐

  • 强化学习算法 DQN 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 强化学习算法 DQN 解决 CartPole 问题 移动小车使得车上的摆杆保持直立 这个游戏环境可以说是强化学习中的 Hello World 大
  • Visual C++ ADO数据库编程入门(1)

    ADO 是目前在Windows环境中比较流行的客户端数据库编程技术 ADO是建立在OLE DB底层技术之上的高级编程接口 因而它兼具有强大的数据处理功能 处理各种不同类型的数据源 分布式的数据处理等等 和极其简单 易用的编程接口 因而得到了
  • 分布式系统详解--框架(Hadoop--RPC协议)

    分布式系统详解 框架 Hadoop RPC协议 在之前的一篇文章当中已经写过一篇文章是关于RPC通信协议的文章 是 分布式系统详解 基础知识 通信 是讲的关于网络通信的最基本的知识 这篇文章也简单讲一下关于hadoop内部的网络通信 一 h
  • 蓝桥杯第四届题目答案

    蓝桥杯第四届省赛javaB组题目答案 第一题 标题 世纪末的星期 曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不
  • android instrumentation 原理,理解 android instrumentation

    instrumentation 先看activity的启动过程 Override public void startActivity Intent intent Nullable Bundle options if options null
  • pyqt拖拽获取文件路径

    main py import sys import PyQt5 QtWidgets as qw from mainwindow import Ui MainWindow class TestWindow qw QMainWindow def
  • [UE4]C++中SpawnActor用法(动态创建Actor)

    注 这里创建actor跟unity有明显不同 ue不能创建一个单独的actor 单独的actor也没意义 ue里的actor是用来继承的 这里创建的actor都是实例化actor的子类 细想下 并不影响动态创建对象 ue417用下面的写法貌
  • 【LINUX】i.MX6学习笔记(1) 调试环境搭建(MfgTool) + 学习资料(正点原子 + 韦东山)

    1 引言 说起来 和linux打交道也挺久了 最近3年的主要工作都是在linux下做的应用层开发 在做应用层之前 因为做控制算法的原因 很多东西又是在单片机或者DSP上跑的裸核 二者一合并 中间就出现了一个巨大的断层 就是Linux 驱动
  • [jdbc]DAO及相关实现类

    DAO及相关实现类 DAO BaseDAO java CustomerDAO java CustomerDAOImpl java 测试CustomerDAOImplTest 升级版就是把Customer class 去掉 具体没写 再jdb
  • 数据库之表格(一): 建表-备份-恢复【SQL-Server】

    不求点赞 只求耐心看完 指出您的疑惑和写的不好的地方 谢谢您 本人会及时更正感谢 希望看完后能帮助您理解算法的本质 目录 一 操作一 建立表格 二 操作二 备份表格 三 操作三 恢复导入表格 一 操作一 建立表格 可以都设为 c h a r
  • 静态综合实验

    对未来的真正慷慨 是把一切都献给现在 阿尔贝 加缪 反抗者 静态综合实验 让我们来看看实验的样子 IP地址划分 R3下方电脑DHCP获取IP地址 路由表要尽量小 就要写缺省路由 缺省路由方向要相同 否则出现路由环路 但是缺省路由不能代表所有
  • 光纤通信技术

    目录 1 绪论 2 光纤和光缆 2 1 光纤 1 阶跃型光纤 2 渐变型光纤 3 波动光学分析 4 光纤的基本特性 2 2 光缆 3 光源和光发射机 3 1 光电器件的一般工作原理 3 2 发光二极管 LED 3 3 半导体激光器 LD 3
  • Java集合基础知识必会(一)

    Java集合基础知识 一 Java集合是Java中一种非常重要的数据结构 它提供了一种方便而高效的方式来存储和处理数据 本文将介绍Java集合的基础知识 包括集合框架的概述 常见的集合接口和实现类 以及一些使用案例 集合框架概述 Java集
  • OpenCV 变换整幅图像的warpPerspective()函数——中心化坐标表示

    OpenCV自带的warpPerspective 函数 可以根据透视变换参数实现从一幅图像到另外一幅图像之间的映射变换 OpenCV为了保证坐标的对应关系 在一些情况下 会对变换的图像进行裁剪 以至于不能显示图像全貌 如图1所示 这限制了其
  • A. 运维体系 --- SLA理论体系

    A 运维体系 SLA理论体系 概述 SLA 是服务供应商与客户之间的服务等级协议 它定义了服务供应商应保证的服务质量 以及在服务不达标情况下的服务赔偿 SLA在定义上又细分为SLI SLO与SLA SLI 服务质量指标 服务的某项质量的一个
  • Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    1 将一个文件夹下的所有内容复制到另一个文件夹下 cp r home packageA home cp packageB 或 cp r home packageA home cp packageB 这两种方法效果是一样的 方法示例 2 将一
  • 201809-3元素选择器

    题目链接 题目描述 样例输入 11 5 html head title body h1 p subtitle div main h2 p none div p two p subtitle h3 div p div div p 样例输出 3
  • 适用于Windows的Xcode:在PC上安装Xcode的5种方法

    适用于Windows的Xcode 在PC上安装Xcode的5种方法 您的目标是开发iOS应用程序但是您没有可以支持Apple操作系统的计算机吗 您不必担心 因为您可以在Windows计算机上运行Xcode Xcode是一个值得信赖的macO
  • JavaWeb----SSM框架简单的搭建和使用---2021-07-22

    一 先对SSM矿建做个简单的介绍 大概先了解这是做啥的有啥用 下面是详细到每一步的保姆级教程 SSM简介 SSM Spring SpringMVC MyBatis 框架集由Spring MyBatis两个开源框架整合而成 SpringMVC
  • 从0到1搭建个人博客-Django(三)

    你好 我是goldsunC 让我们一起进步吧 从0到1搭建个人博客 Django 三 在以下链接快速回顾系列文章内容 从0到1搭建个人博客 Django 一 从0到1搭建个人博客 Django 二 本篇内容主要是一些框架概念性的东西 需要理