一、Django框架简介
Django 的 MTV 模式上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些不同,Django 的 MTV 分别是指:
- M 代表模型(Model):负责业务对象和数据库的关系映射(ORM);
- T 代表模板(Template):负责如何把页面展示给用户(HTML);
- V 代表视图(View):负责业务逻辑,并在适当时候调用 Model 和 Template;
除了以上的三层指外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 Views 处理,Views 再调用响应的 Model 和 Template,MTV 的响应模式如下:
一般是用户通过浏览器想服务器发送一个请求,这个请求回去访问视图函数(如果不涉及到数据调用,那么这个时候视图函数就返回一个模板也就是一个网页给用户),视图函数去调用模型,模型去数据库中查找数据,然后逐级返回,视图函数把要返回的数据填充到模板中空格中,最后返回网页给用户。
二、创建Django项目
2.1、建立虚拟环境
使用 Django 之前,需要建立虚拟的工作环境。虚拟环境 是系统的一个位置,你可在其中安装第三方的库,并将这些包与其它的 Python 的包隔离开来。我们新建一个目录,将其命名为【Django】,再在终端中切换到这个目录,并执行如下命令,建立虚拟环境。
python -m venv ll_env
这里运行了模块 venv,并使用创建了一个名为 ll_env 虚拟环境。
2.2、激活虚拟环境
如果你使用的 Windows 系统,我们需要在终端中输入下面的命令的来激活虚拟环境:
ll_env\Scripts\activate
如果你使用的是 PowerShell,可能需要将 acticate 的首字母大写;
如果你使用的是 Mac 或 Linux ,需要下面的命令激活虚拟环境:
source ll_env/bin/activate
激活虚拟环境后,会在终端最前面显示 (ll_env),其中 ll_env 为虚拟环境名。
如果要停止虚拟环境,可执行 deactivate 命令:
deactivate
如果关闭运行虚拟环境的终端,虚拟环境也将不在处于活动状态;
2.3、安装Django
激活虚拟环境后,我们在可以在终端中执行如下命令更新 pip 并安装 Django:
pip install --upgrade pip
pip install django[==版本号]
2.4、在Django中创建项目
在虚拟环境依然处于活动状态的情况下(ll_env 包含在括号内),执行如下命令创建一个项目:
django-admin startproject ll_project .
命令 startproject 让 Django 新建一个名为 ll_project 的项目。这个命令末尾的句点(.)让新项目使用合适的目录结构。
Django 新建了一个名为 ll_project 的目录。它还创建了文件 manage.py 文件,这是一个简单的程序,接受命令并将其交给 Django 的相关部分。
目录 ll_project 包含 4 个文件,其中最重要的是 setting.py、urls.py 和 wsgi.py。文件 settings.py 指定 Django 如何与系统交互以及如何管理项目。在开发项目的过程中,我们将修改其中的一些设置,并添加一些设置。文件 urls.py 告诉 Django,应创建那些网页来响应浏览器请求。文件 wsgi.py 帮助 Django 提供它创建的文件,名称是 web server gateway interfece(Web 服务器网关接口)的首字母缩写。
2.5、创建数据库
Django 将大部分与项目相关的信息存储在数据库中,因此需要创建一个 Django 使用的数据库。
python manage.py migrate
我们将修改数据库称为 迁移(migrate)数据库。首次执行命令 migrate 将让 Django 确保数据库与项目的当前状态匹配。在使用 SQLite 的新项目中首次执行这个命令时,Django 将新建一个数据库。在这里,Django 指出它将准备好数据库,用于存储执行管理和身份验证任务需要的信息。
2.6、查看项目
我们可以使用命令 runserver 查看当前项目的状态:
python manage.py runserver
Django 将启动一个服务器(development server),让你能够查看系统中的项目。如果你在浏览器中输入 URL 以请求网页,那么该 Django 服务器将进行响应:生成合适的网页,并将其发送给浏览器。
Django 首先通过检查确定正确地创建了项目,然后指出使用的 Django 版本以及当前使用的设置文件的名称,最后指出项目的 URL。URL http://127.0.0.1:8000/
表明项目将在你的计算机的端口 8000 上侦听请求。localhost 表示只处理当前系统发出的请求的服务器,它不允许其他人查看正在开发的网页。
在浏览器的地址栏中输入 URL http://localhost:8000/
(如果不管用,请输入:http://127.0.0.1:8000/
),浏览器将返回这样的一个界面,这个界面是由 Django 创建的。
如果我们想关闭服务器,可以在执行 runserver 命令的窗口按 Ctrl+C;
如果出现错误 "That port is already in use"(指定端口被占用),请执行 python manage.py runserver 8001,让 Django 使用另一个端口。如果这个端口也不可用,请逐渐增大端口号并继续执行上述命令,直到找到可用的端口;
三、创建应用程序
Django 项目由一系列应用程序组成,它们协同工作让项目成为一个整体。前面打开的终端窗口还应该运行的 runserver。我们新建一个终端端口,并切换到 manage.py 所在的目录。激活虚拟环境,然后执行命令 startapp:
python manage.py startapp blog
命令 startapp appname 让 Django 搭建应用程序所需的基础设施。查看项目目录,将看到其中新增了文件夹 blog,其中最重要的文件是 models.py、admin.py 和 views.py 文件。
3.1、定义模型
models.py 文件定义要在应用程序中管理的数据。模型告诉 Django 如何处理应用程序中存储的数据。模型就是一个类,包含属性和方法。
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用户学习主题"""
# 由字符组成的数据,即文本
# 在定义CharField属性时,必须告诉Django该在数据库预留多少空间
text = models.CharField(max_length=200)
# 记录日期和时间的数据
# auto_now_add=True,每当用户创建新主题,Django都会将这个属性自动属性设置为当前的日期和时间
date_added = models.DateTimeField(auto_now_add=True)
# 每当需要生成表示模型实例的输出时,Django都将调用这个方法
def __str__(self):
# 返回模型的字符串表示
return self.text
3.2、激活模型
使用这些模型,必须让 Django 将前述应用程序包含到项目中。为此,打开 settings.py (它位于目录 ll_project 中)文件,其中有个片段告诉 Django,,那些应用程序被安装到了项目中。
修改 INSRALLED_APPS 列表,将我们创建的应用程序添加到这个列表中:
INSTALLED_APPS = [
# 我的应用程序
'blog',
# Django默认加载的应用程序
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
务必将你自己创建的应用程序放在默认应用程序前面,这样能够覆盖默认应用程序的行为。
接下来,需要让 Django 修改数据库,使其能够存储与模型相关的信息。为此,需要在终端中执行如下命令:
python manage.py makemigrations blog
命令 makemigrations 让 Django 确定该如何修改数据库,使其能够存储与前面定义的新模型相关联的数据。
每次修改或添加模型后,都需要执行如下命令,再次迁移数据库。
python manage.py migrate
每次添加或修改模型,都需要修改 models.py 文件,执行命令 python manage.py makemigrations appname 激活模型,在执行命令 python manage.py migrate 迁移数据库;
3.3、Django管理网站
Django 提供的 管理网站(admin site)让你能够轻松地处理模型。Django 管理网站仅供网站的管理员使用,普通用户不能使用。
3.3.1、创建超级用户
Django 允许创建具备所有权限的用于,即 超级用户(superuser)。权限 决定了用户可执行的操作。最严格的权限设置只允许用户阅读网站的公开信息。注册用户通常可以阅读自己的私有数据,还可以查看一些只有会员才能查看的信息。
要在 Django 中创建超级用户,我们可以在终端中执行如下命令:
python manage.py createsuperuser
在执行命令 createsuperuser 时,Django 会提示输入超级用户的用户名。这里输入的是 ll_admin,但其实可以输入任意用户名,也可以不输入用户名,用默认用户名。接下来的电子邮箱地址可以输入也可以不输入。然后需要输入两次密码。
我们在浏览器的地址栏中输入网址 http://localhost:8000/admin
回车,浏览器会返回一个登录页面,我们需要用户名和密码就可以访问管理网站。
如果无法加载网站,建议关闭服务器,并重新启动;
3.3.2、向管理网站注册模型
Django 自动在管理网站上添加了一些模型,如 Groups 和 Users。如果要添加我们创建的模型,则必须手动注册。
在我们创建应用程序 blog 时,Django 在 modles.py 所在的目录中创建了一个名称 admin.py 文件。在这个文件中,我们可以注册自己的模型。
from django.contrib import admin
from .models import Topic
# Register your models here.
admin.site.register(Topic)
首先导入要注册的模型 Topic。models 前面的句点让 Django 在 admin.py 所在的目录中查找 models.py。admin.site.register() 让 Django 通过管理网站管理该模型。
现在我们刷新管理网站,可以看到管理网站上新增了 Topic 这个模型。管理网站不仅让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型相关的数据。
3.3.3、添加主题
在管理网站注册模型后,我们可以添加主题。单击 Add 按钮,会出现一个用于添加新主题的表单,输入主题内容后并单击 Save 按钮。
四、创建网页
使用 Django 创建网页的过程分为三个阶段:定义 URL,编写视图 以及 编写模板。URL 模式 描述了 URL 的构成,让 Django 直到如何将浏览器请求与网站的 URL 匹配,以确定返回哪个网站。每个 URL 都被映射到特定的 视图。视图函数获取并处理网页所需的数据。视图函数通常使用 模板 来渲染网页,而模板定义网页的总体结构。
4.1、映射URL
用户通过在浏览器中输入 URL 和单击链接来请求网页,因此需要确定项目需要哪些 URL。主页的 URL 最重要,它是用户用来访问项目的基础 URL。
打开项目的主文件夹 ll_project 中的文件 urls.py,它的内容如下:
开头两行导入模块 admin 和一个函数,以便创建 URL 路径。在这个为整个项目定义 URL 的 urls.py 文件中,变量 urlpatterns 包含项目中应用程序的 URL。这里使用模块 admin.site.urls,它定义了可在管理网站中请求的所有 URL。
因为需要包含 blog 中的 URL,所以添加如下代码:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls'))
]
这里导入了函数 include(),还添加了一行代码来包含 blog.urls 模块。默认的 urls.py 在文件夹 ll_project 中,现在需要在文件夹 blog 中再创建一个 urls.py 文件,并在该文件中添加如下内容:
"""定义 blog 的 URL 模式"""
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
# 主页
path('', views.index, name='index'),
]
导入函数 path(),因为需要使用它将 URL 映射到视图。然后导入 views 模块,其中的句点让 Python 从当前 urls.py 模块所在的文件夹中导入 views。变量 app_name 让 Django 能够将这个 urls.py 文件与项目内其它应用程序的同名文件区别开来。在这个模块中,变量 urlpatterns 是一个列表,包含可在应用程序 blog 中请求的网页。
实际上 URL 模式是对 path() 函数的调用,这个函数接受三个实参。第一个是一个字符串,帮助 Django 正确的 路由(route)请求。收到请求的 URL 后,Django 力图将请求路由给一个 视图,并为此搜索所有的 URL 模式,以找到与当前请求匹配的。Django 忽略项目的基础 URL(http://localhost:8000
),因此空字符串与基础的 URL 匹配。其它 URL 都与这个模式不匹配。如果请求的 URL 与任何既有的 URL 模式都不匹配,Django 将返回一个错误页面。
path() 的第二个实参指定要调用 views.py 中的哪个函数。当请求的 URL 与前述表达式匹配时,Django 将调用 views.py 中的 index() 函数(暂时还未写)。
path() 的第三个实参将这个 URL 模式的名称指定为 index,让我们能在其它项目文件中轻松地引用它。每当需要提供这个主页地链接时,都将使用这个名称,而不编写 URL。
4.2、编写视图
视图函数接接受请求地信息,准备好生成网页所需要地数据,再将这些数据发给浏览器。这通常时使用定义网页外观的模板实现的。
blog 中的文件 views.py 是执行命令 python manage.py startapp
时自动生成的,其当前内容如下:
当前,这个文件中只导入 render() 函数, 该函数根据视图提供的数据渲染响应。我们在这个文件中添加为主页编写视图的代码:
from django.shortcuts import render
# Create your views here.
def index(request):
"""博客主页的"""
return render(request, 'index.html')
当 URL 请求与刚才定义的模式匹配时,Django 将在 views.py 中查找 index() 函数,再将对象 request 传递给这个视图函数。这里不需要处理任何数据,因此这个函数只包含调用 render() 的代码。这里向 render() 函数提供了两个实参:对象 request 和一个可用于创建网页的模板。
4.3、编写模板
模板定义网页的外观。每当网页被请求时,Django 都将填入相关的数据。模板让你能够访问视图提供的任何数据。
在文件夹 blog 中新建一个文件夹,并将其命名为 templates。在文件夹 templates 中用来存储有关模板的 HTML 文件。这里新建一个 index.html 文件(它的文件路径为:blog/templates/index.html),它的内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Blog</h1>
</body>
</html>
现在,如果请求这个项目的基础 URL http://localhost:8000/
,将看到刚才创建的页面,而不是默认的 Django 网页。Django 接受请求的 URL,发现该 URL 与模式 '' 匹配,因此调用 views.index() 函数。这将使用 index.html 包含的模板渲染网页。