<学习笔记>从零开始自学Python-之-web应用框架Django(一)从Hello World 到 MTV

1、Django简介      

       作为应用最为广泛的Python语言开发web应用的框架,Django是学习Python必须要学的基础框架之一。

       Django是一个开放源代码的web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。2019年12月2日,Django 3. 0发布 [1]  。

       Django是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。Django其实也是一个MTV 的设计模式。MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。

2、安装Django

很简单,直接用命令   pip install django

        如果速度很慢可以用国内镜像,具体办法请参照我的帖子TensorFlow2自学笔记_阿尔法羊的博客-CSDN博客的准备工作部分。

3、创建项目

        一个项目是一个 Django 实例的一系列设置。如果这是你第一次使用 Django,要做些初始设置。具体来说, 你要自动生成一些代码,创建一个 Django 项目,即 Django 实例的一系列设置,包括数据库配置、Django 相 关的选项和应用程序相关的设置。

        进入想要创建项目的目录,启动命令行,然后敲入以下命令

        django-admin startproject newweb[这里是自己起的项目名称]

        上述命令会在当前目录(或者是虚拟环境,如 \env_mysite\)中新建 newweb 目录。如果你不想在根目录中创建项目,可以 新建一个目录,然后进入其中,再运行 startproject 命令。

我们来看一下 startproject 为我们创建了什么:

newweb/

    manage.py

    newweb/

        __init__.py

        settings.py

        urls.py

        wsgi.py

这些文件是:

• 外层的 newweb/ 根目录是项目的容器。这个目录的名称对 Django 没有什么作用,你可以根据喜好重命名。

• manage.py 是一个命令行实用脚本,可以通过不同的方式与 Django 项目交互。这个文件的详细说明参 见 Django Project 网站。

• 内部的 newweb/ 目录是项目的 Python 包。导入这里面的内容时要使用目录的名称(如 mysite.urls)。

• newweb/init.py 是一个空文件,目的是让 Python 把这个目录识别为 Python 包。

• newweb/settings.py 是 Django 项目的设置/配置。

• newweb/urls.py 是 Django 项目的 URL 声明,即 Django 驱动的网站的“目录”。

• newweb/wsgi.py 是兼容 WSGI 的 Web 服务器的入口点,用于伺服项目。

3.1、Django 的设置

接下来,编辑 newweb/settings.py。

这是一个普通的 Python 模块,在模块层定义了一些变量,表示 Django 的设置。

编辑 settings.py 的第一步是把 TIME_ZONE 设为你所在的时区。注意文件顶部的 INSTALLED_APPS 设 置,其值是这个 Django 实例中激活的全部 Django 应用。一个应用可以在多个项目中使用,而且应用可以打 包,供其他项目使用。默认情况下,INSTALLED_APPS 包含下述应用,这些都是 Django 自带的:

• django.contrib.admin:管理后台

• django.contrib.auth:身份验证系统

• django.contrib.contenttypes:内容类型框架

• django.contrib.sessions:会话框架

• django.contrib.messages:消息框架

• django.contrib.staticfiles:管理静态文件的框架

Django 项目默认包含这些应用,这是为常见场景所做的约定。

其中某些应用要使用数据库表,因此使用之前 要在数据库中创建所需的表。

为此,运行下述命令:

python manage.py migrate migrate

命令查看 INSTALLED_APPS 设置,根据 settings.py 文件中的数据库设置,以及应用自带的数据库迁移 (后文说明)创建所需的数据库表。每执行一个迁移都会看到一个消息。

3.2、开发服务器

下面确认 Django 项目是否能运行。

进入外层 newweb 目录(如果你现处别的位置),然后运行下述命令:

python manage.py runserver

在命令行中将看到下述输出:

July 31, 2022 - 02:13:16
Django version 3.2.8, using settings 'newweb.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

然后打开浏览器,输入http://127.0.0.1:8000/ 回车,应该能看到下面这个欢迎页面

我们启动的是 Django 开发服务器,这是一个轻量级 Web 服务器,完全使用 Python 编写。Django 自带这个服务器,以便快速开发,而不用花时间配置生产服务器(如 Apache)——这一步在准备好部署到生产环境时再做。

注意,别在任何生产环境中使用这个服务器,它只能在开发过程中使用。

4、先来个Hello World

4.1视图

在上面的newweb目录下新建一个views.py文件,这个文件用来保存视图(view)

在views.py文件中,敲入以下代码:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

逐行分析一下这段代码:

• 首先,从 django.http 模块中导入 HttpResponse 类。导入这个类是因为后面的代码要使用。

• 然后,定义一个名为 hello 的函数,这是视图函数。视图函数至少有一个参数,按约定,名为 request。这是一个对象,包含触发这个视图的 Web 请求的信息,是 django.http.HttpRequest 类的实例。

这里,我们没有用到 request,但

是必须作为第一个参数传给视图。注意,视图函数的名称没有关系,无需 使用特定的方式命名,Django 能识别它。我们把这个视图命名为 hello,因为这个名称能明确表明视图的作用。如果愿意,也可以命名为其他任何名称。

这个函数的定义体只有一行代码:返回使用文本 "Hello world" 实例化的 HttpResponse 对象。

这里的主要知识点是,视图就是普通的 Python 函数,它的第一个参数是 HttpRequest 对象,返回值是一个 HttpResponse 实例。Python 函数要想变成 Django 视图,必须做这两件事。

4.2 URL配置

了解Python函数就知道,我们上面的动作只是定义了一个视图函数,这个函数还没发挥作用。

要想让视图函数发挥作用,还要配置URL

若想把视图函数与特定的 URL 对应起来,要使用 URL 配置(URLconf)。URL 配置相当于 Django 驱动的网 站的目录。简单来说,URL 配置把 URL 映射到相应的视图函数上。我们以这种方式告诉 Django,“访问这个 URL 时调用这些代码,访问那个 URL 时调用那些代码”。

找到系统默认生成的urls.py文件,这时候只有一个默认的URL设置

from django.contrib import admin
from django.urls import path
urlpatterns = [
    path('admin/', admin.site.urls),
]

path函数作用是让特定的url访问特定的函数

第一个参数就是url,默认省略了网站,所以这里的'admin/' 完整访问就是 http:/127.0.0.1/admin/

第二个参数是指定的函数,这里是调用的django.contrib模块里面的 admin函数,我们自己写的视图函数主要放在views.py文件中

如果我们想要通过访问 http:/127.0.0.1/hello/ 实现显示helloworld页面的功能,就要在这里添加

from django.contrib import admin
from django.urls import path
from newweb.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/',hello)
]

因为我们通过 from newweb.views import * 导入了views中所有函数,所以下面第二个参数直接写 hello就可以了

现在我们访问http:/127.0.0.1/hello/,可以看到页面上显示了 helloworld

 当然,如果我们想直接通过访问http:/127.0.0.1/实现helloworld,那么就改一下urls.py的urlpatterns

from django.contrib import admin
from django.urls import path
from newweb.views import *

urlpatterns = [
    path('',hello),
    path('admin/', admin.site.urls),
    path('hello/',hello)
]

直接空格表示网站根地址,这里就是 http:/127.0.0.1/,这样直接打开网页就能看到helloworld了

5、理解MVC模式

5.1 Django 处理请求的过程

通过上面的helloworld例子,我们大概了解了 Django 的运作机制。现在我们详细分析一下

当你在 Web 浏览器中访问 http://127.0.0.1:8000/hello/,看到“Hello world”消息,在这个过程中 Django 在背后做了什么呢?

一切都从 设置文件开始。

运行 python manage.py runserver 命令时,

manage.py 脚本在内层 newweb 目录中寻找名为 settings.py 的文 件。

这个文件中保存着当前 Django 项目的全部配置,各个配置的名称都是大写的,

例如 TEMPLATE_DIRS、 DATABASES,等等。

其中最重要的设置是 ROOT_URLCONF。

它告诉 Django,网站的 URL 配置在哪个 Python 模块 中。

记得吗?运行 django-admin startproject 命令时创建了 settings.py 和 urls.py 文件。

自动生成的 settings.py 文件中包含 ROOT_URLCONF 设置,指向自动生成的 urls.py 文件。

打开 settings.py 文件看一下。应该会看到下述设置: ROOT_URLCONF = 'newweb.urls' 这个模块对应的文件是 newweb/urls.py。

收到针对某个 URL(假如是 /hello/)的请求时,Django 加载 ROOT_URLCONF 设置指定的 URL 配置;然后按顺序检查 URL 配置中的各个 URL 模式,依次与请求的 URL 比 较,直到找到匹配的模式为止。 找到匹配的模式之后,调用对应的视图函数,并把一个 HttpRequest 对象作为第一个参数传给视图。

如我们编写的第一个视图所示,视图函数必须返回一个 HttpResponse 对象。 随后,余下的工作交给 Django 处理:把那个 Python 对象转换成正确的 Web 响应,并且提供合适的 HTTP 首 部和主体(即网页的内容)。

综上:

第1步:请求 /hello/。

第2步:Django 查看 ROOT_URLCONF 设置,找到根 URL 配置。

第3步:Django 比较 URL 配置中的各个 URL 模式,找到与 /hello/ 匹配的那个。

第4步:如果找到匹配的模式,调用对应的视图函数。

第5步:视图函数返回一个 HttpResponse 对象。

第6步:Django 把 HttpResponse 对象转换成正确的 HTTP 响应,得到网页。

5.2 理解MVC模式与MTV开发模式

5.2.1 MVC的概念

MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。

MVC 这个概念存在很长时间了,但是随着互联网的发展才被更多的人熟知,因为它是设计客户端-服务器应 用的最佳方式。就概念层次而言,MVC 设计模式非常容易理解:

• 模型(M)是数据的表述。它不是真正的数据,而是数据的接口。使用模型从数据库中获取数据时, 无需知道底层数据库错综复杂的知识。模型通常还会为数据库提供一层抽象,这样同一个模型就能使 用不同的数据库。

• 视图(V)是你看到的界面。它是模型的表现层。在电脑中,视图是你在浏览器中看到的 Web 应用的页面,或者是桌面应用的 UI。视图还提供了收集用户输入的接口。

• 控制器(C)控制模型和视图之间的信息流动。它通过程序逻辑判断通过模型从数据库中获取什么信息,以及把什么信息传给视图。它还通过视图从用户那里收集信息,并且实现业务逻辑:变更视图, 或者通过模型修改数据,或者二者兼具。

5.2.2 MTV开发模式

Django 严格遵守 MVC 模式,但是有自己的实现逻辑。

“C”部分由框架处理,多数时候,我们的工作在模型、模板和视图中,因此 Django 经常被称为 MTV 框架。

在 MTV 开发模式中:

• M 表示“模型”,即数据访问层。这一层包含所有与数据相关的功能:访问数据的方式、验证数据的方 式、数据的行为、数据之间的关系。

• T 表示“模板”,即表现层。这一层包含表现相关的决策:在网页或其他文档类型中如何显示某个东 西。

• V 表示“视图”,即业务逻辑层。这一层包含访问模型和选择合适模板的逻辑。你可以把视图看做模型 和模板之间的桥梁。

        在名称的使用上,这可能是 Django 唯一的不足,因为 Django 的视图更像是 MVC 中的控制器,而 MVC 中的 视图是 Django 中的模板。

5.2.3 我的通俗理解

在Django开发工作中,我们主要做三方面工作:

• 搭建数据结构,Django内置了一个小型数据库,可以直接使用(当然用外置的数据库也是可以的),更为贴心的是,Django有个模型的模块,它让你不用深究数据库的内部关系和复杂的实现过程,可以便捷地实现对数据的管理。这就是M。

• 编辑web页面。就是用HTML的语法设计页面或应用UI,即模板,这就是T。

• 实现业务逻辑。对模型的数据进行操作、运算,并把结果给到模板,让web页面显示出来。这就是V。

层次

职责

模型(Model),即数据存取层

处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

模板(Template),即表现层

处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

视图(View),即业务逻辑层

存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

(以下引自百度)

        从以上表述可以看出Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说, Django将MVC中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。

        至于MVC控制器部分,由Django框架的URLconf来实现。URLconf机制是使用正则表达式匹配URL,然后调用合适的Python函数。URLconf对于URL的规则没有任何限制,你完全可以设计成任意的URL风格,不管是传统的,RESTful的,或者是另类的。框架把控制层给封装了,无非与数据交互这层都是数据库表的读,写,删除,更新的操作。在写程序的时候,只要调用相应的方法就行了,感觉很方便。程序员把控制层东西交给Django自动完成了。 只需要编写非常少的代码完成很多的事情。所以,它比MVC框架考虑的问题要深一步,因为我们程序员大都在写控制层的程序。这个工作交给了框架,仅需写很少的调用代码,大大提高了工作效率。

        数据、表现和逻辑的三分离,使得大规模协作更为便捷,数据的更新可以直接反映在页面,逻辑的更改和页面的更新互不干扰,这样在团队开发中,某个部门只需要负责一部分的事情,而不用担心自己的开发会影响别的部分。

猜你喜欢

转载自blog.csdn.net/qq_41597915/article/details/126079683