1. 基础知识
1.1 互联网和万维网
互联网(Internet)是一个广泛的全球互联计算机系统;万维网(World Wide Web)是互联网的一个子集,指通过超链接相互连接的超文本文档(换句话说,就是网页)。- 互联网依赖于各种"通信协议",这些协议类似于人类语言,它们允许世界各地的计算机通过约定的规则进行通信。例如,
- 文件共享使用文件传输协议(FTP),
- 发送电子邮件使用简单邮件传输协议(SMTP),
- 语音通信使用互联网语音协议(VoIP),
- 而浏览网页使用
超文本传输协议(HTTP)。
1.2 客户端-服务器 模型
- 支撑万维网的是
客户端-服务器模型- "客户端"指任何连接互联网的设备,用于发出服务请求,例如计算机、手机、洗碗机等;
- "服务器"是回应服务请求的计算机硬件或软件。换句话说,客户端发出请求,服务器返回响应。
- 支撑互联网的计算机通常被称为服务器
- 实际上它们只是一直连接到互联网的计算机,运行特殊的软件,使它们能够向其他计算机"提供"信息。
- 你自己的计算机也可以成为服务器,但实际上大多数服务器都存在于大型数据中心(也称为"云")中。
- 既然我们在所有这些中都使用 HTTP 协议,我们可以更具体地说:
- 客户端发出
HTTP 请求, - 服务器返回
HTTP 响应。
- 客户端发出
- 像 LearnDjango.com 这样的网站的完整域名实际上是 https://learndjango.com。
- 开头的 https:// 表明我们使用的是 HTTP 协议,
HTTPS是 HTTP 的加密版本,现在占据了大部分网络流量。现代网页浏览器会自动为你添加这个,所以大多数普通用户只需输入域名,而不会意识到背后的 HTTP。- 你的网页
浏览器将 HTTP 响应中的数据呈现出来,生成网页。每次你点击链接或请求新的网址时,这个 HTTP 请求/响应循环都会重新开始。通信就这样来回进行。

1.3 Django 与 客户端-服务器 模型
- 网站托管在物理服务器上,并自动处理 HTTP 请求和响应。它依赖于一些后续笔记中介绍的额外机制。
- 在
本地开发中,情况要简单得多。Django 配备了一个轻量级的开发服务器runserver,它管理 HTTP 请求和响应,帮助 Django 从数据库生成动态内容,并提供静态文件(稍后会详细介绍)。它非常强大。

1.4 静态网页 & 动态网页
- 静态网站
- 由单个HTML文档组成,这些文档会以原样通过HTTP发送到你的网页浏览器。
- 这种方法适用于非常小的网站,但当网站需要数百或数千个页面时,很快就会行不通。
动态网站- 由数据库、HTML模板和应用服务器组成
- 应用服务器可以在通过HTTP发送文件到浏览器之前更新这些文件。
- 大多数大型网站采用这种方法,因为这意味着数百万个网页可以仅通过几个HTML模板、一小部分逻辑和一个大型数据库来生成。
1.5 Django & 动态网页
Django 旨在用于动态网站,大多数网站都需要相同的基本工具:
- 处理
URL请求的方法 - 连接
数据库的方法 - 通过从数据库中过滤数据生成
动态内容的方法 - 创建模板以便根据需要为
HTML添加样式、CSS、图片等的方法
1.6 MVC & MVT
1.6.1 MVC(传统)
MVC = Model-View-Controller = 模型-视图-控制器
- 模型(Model):管理数据和核心业务逻辑
- 视图(View):以特定格式呈现模型数据
- 控制器(Controller):接收用户输入并执行应用程序特定的逻辑
1.6.2 MVT(Django)
MVT = Model-View-Template = 模型-视图-模板
- Django 的方法有时被称为模型-视图-模板(MVT)
- 但它实际上是一个包含 URL 配置的四部分模式。类似模型-视图-模板-URL(MVTU)的说法可能更准确:
- 模型(Model):管理数据和核心业务逻辑
- 视图(View):描述哪些数据发送给用户,但不涉及其展示方式
- 模板(Template):将数据呈现为 HTML,可附加 CSS、JavaScript 和静态资源
- URL 配置(URL Configuration):将正则表达式组件配置到视图上
1.6.3 两者的关系
- MVC 中的"视图"类似于 Django 中的"模板"
- 而 MVC 中的"控制器"则被拆分为 Django 的"视图"和"URL 配置"
| MVC | MVT |
|---|---|
| 模型 | 模型 |
| 视图 | 模板 |
| 控制器 | 视图 + URL 配置 |
1.6.4 ★ Django 工作流程 ★
- 当你输入一个
URL,比如 https://djangoproject.com - 我们的 Django 项目中首先发生的是 runserver 开始运行,并帮助 Django 查找匹配的 URL 模式(包含在 urls.py 中),这个 URL 模式与单个
视图(包含在 views.py 中)相关联, - 该视图将
模型(存储在 models.py 中)中的数据与模板(任何以 .html 结尾的文件)中的样式结合起来。 - 然后,视图向用户返回 HTTP 响应。

2. 第一个项目
我的系统是 Ubuntu 24.04 LTS
2.1 创建项目
在上一期博客《Web应用开发笔记】Django笔记1:环境安装》中有详细介绍,这里还是简要介绍一遍。
- step1: 创建 python 环境
bash
cd 项目路径
python3.11 -m venv py3p11_Django
注:这里需要有前置准备 python 3.11 的基础环境,可以用 which python3.11 检查一下有没有,如果没有则用 sudo apt install python3.11 python3.11-venv python3.11-dev 命令安装 python
- step2: 激活环境
bash
source py3p11_Django/bin/activate
- step3: 安装 Django 等包
bash
python -m pip install django~=4.2.0
python3 -m pip install black
- step4: 创建 Django 项目
bash
django-admin startproject django_project .
text
├── django_project/
│ ├── __init__.py
| ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── py3p11_Django/
说明
• _init _.py 表明该文件夹中的文件是 Python 包的一部分。没有这个文件,我们就无法从另一个目录导入文件
• asgi.py 允许运行可选的异步服务器网关接口(Asynchronous Server Gateway Interface)。
• settings.py 控制我们的 Django 项目的整体设置。
• urls.py 告诉 Django 在响应浏览器或 URL 请求时应该构建哪些页面。
• wsgi.py 代表 Web 服务器网关接口(Web Server Gateway Interface),关于这部分我们将在下一篇笔记第一次部署时详细讲解。
• manage.py 文件不在 django_project/ 文件夹下,但它用于执行各种 Django 命令,例如运行本地 web 服务器或创建新应用。
2.2 启动项目
- 启动项目
bash
django-admin startproject django_project .
注:此时会有告警You have 18 unapplied migration(s). ,但是可以忽略。告警的原因是尚未"迁移"初始数据库。
- 初始数据库
如果执行python manage.py migrate命令会出现一个初始数据库db.sqlite3,此时再重新启动项目则不会有告警
text
├── django_project
│ ├── __init__.py
| ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── db.sqlite3 # new <===
├── manage.py
└── py3p11_Django/
3. 创建 APP
3.1 什么是 Django 中的 APP
- 一个 Django 项目可以包含许多"
APP",- 这是一种保持代码清晰且易于阅读的组织方式,
- 更关键的是这相当于在做
功能解耦。
- 每个应用程序应该控制一个独立的功能模块。例如一个电子商务网站:
- 可能有一个用于用户认证的应用程序,
- 另一个用于支付的应用程序,
- 还有一个用于商品列表详情的应用程序。
3.2 创建一个名为 pages 的APP
3.2.1 自动生成文件
- 命令
bash
python manage.py startapp pages
- 生成的文件
text
├── pages
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
说明:
• admin.py 是用于内置 Django 管理应用的配置文件
• apps.py 是应用本身的配置文件
• migrations/ 用于跟踪我们对 models.py 文件所做的任何更改,从而保持与数据库的同步
• models.py 是我们定义数据库模型的地方,Django 会自动将其转换为数据库表
• tests.py 用于应用特定的测试
• views.py 是处理我们 Web 应用请求/响应逻辑的地方
3.2.2 添加到 settings.py 中
在 django_project/settings.py 文件中,找到 INSTALLED_APPS,添加一行 "pages"
python
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"pages", # new
]
3.2.3 pages 的 views
-
对于我们的第一个网站,我们将创建一个输出文本
"Hello, World!"的网页。 -
这是一个
静态页面,不涉及数据库,甚至不需要模板文件。

-
这是一个很好地介绍 Django 中视图和 URL 工作方式的例子。
视图是一个接受 Web 请求并返回 Web 响应的 Python 函数。响应可以是网页的 HTML 内容、重定向、404 错误、图片,或者任何内容。- 当请求一个网页时,Django 会自动创建一个包含请求元数据的
HttpRequest 对象。然后 Django 加载相应的视图,将 HttpRequest 作为第一个参数传入视图函数。视图最终负责返回一个HttpResponse 对象。
-
在我们的 pages 应用中,已经有一个名为
views.py的文件,该文件带有以下默认代码:
bash
from django.shortcuts import render
# Create your views here.
现在将其简单修改成如下内容
bash
from django.http import HttpResponse
def home_page_view(request):
return HttpResponse("Hello, World!")
3.2.4 URLconfs
3.2.4.1 pages 的 urls
- 在 pages 文件夹下创建一个名为
urls.py的新文件 - 里面添加如下代码
python
from django.urls import path
from .views import home_page_view
urlpatterns = [
path("", home_page_view, name="home"),
]
- 含义
如果用户请求由空字符串 "" 表示的主页,Django 应该使用名为 home_page_view 的视图。
3.2.4.2 项目的 urls
修改 django_project/urls.py 中的代码如下
python
from django.contrib import admin
from django.urls import path, include # new
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("pages.urls")), # new
]
3.3 重启服务
重启服务后打开网页会看到:

4. 小结
4.1 Django服务流程

4.2 如何创建一个不涉及 "模型"、"模版"的网页
- 创建项目
- 创建 python 环境、导入 Django 包
- 创建 Django 项目
- 创建APP
- 添加 APP:自动生成文件并添加到 settings.py
- 写 View:写 views.py 中的函数
- 写 URL conf:写 APP 和 django_project 中的 urls.py
- 启动项目
5. 附录1:生成 requirements.txt
requirements.txt 是 Python 项目的依赖清单文件,它的核心作用是:告诉别人(或未来的自己)这个项目需要安装哪些第三方库才能运行。
- 生成 requirements.txt
bash
pip freeze > requirements.txt
注:这里如果用 conda 环境其生成的 requirements.txt 内容会有问题
- 其他人使用
bash
pip install -r requirements.txt