目录
- 一、基本配置信息
- 二、资源文件配置
-
- [2.1 资源路由------STATIC_URL](#2.1 资源路由——STATIC_URL)
- [2.2 资源集合------STATICFILES_DIRS](#2.2 资源集合——STATICFILES_DIRS)
- [2.3 资源部署------STATIC_ROOT](#2.3 资源部署——STATIC_ROOT)
- [2.2.4 媒体资源------MEDIA](#2.2.4 媒体资源——MEDIA)
- 三、模板配置
- 四、数据库配置
-
- [4.1 mysqlclient连接MySQL](#4.1 mysqlclient连接MySQL)
- [4.2 pymysql连接MySQL](#4.2 pymysql连接MySQL)
- [4.3 多个数据库的连接方式](#4.3 多个数据库的连接方式)
- [4.4 使用配置文件动态连接数据库](#4.4 使用配置文件动态连接数据库)
- [4.5 通过SSH隧道远程连接MySQL](#4.5 通过SSH隧道远程连接MySQL)
- 五、中间件
Django 的配置文件 settings.py
用于配置整个网站的环境和功能,核心配置必须有项目路径、密钥配置、域名访问权限、子应用列表、中间件、资源文件、模板配置、数据库的连接方式。
一、基本配置信息
一个简单的项目必须具备的基本配置信息有:项目路径、密钥配置、域名访问权限、子应用列表和中间件。以 Django5Study 项目为例,settings.py 的基本配置如下:
python
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
# 根路径,后续配置的很多路径都是基于该路径向下
# Django 3.1版本开始,配置文件settings.py的路径信息改用pathlib模块,Django 3.1之前版本使用os模块,
BASE_DIR = Path(__file__).resolve().parent.parent
# SECURITY WARNING: keep the secret key used in production secret!
# 密钥配置
SECRET_KEY = "django-insecure-n^)71(w&)h*-^z-q)460ib07!smqm%ex@yp772f8l8sdu88ibq"
# SECURITY WARNING: don't run with debug turned on in production!
# 调试模式,默认为True,一般在开发环境下使用,生产环境使用False
DEBUG = True
# 域名访问权限
ALLOWED_HOSTS = []
# Application definition
# 子应用列表
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# TODO 1.添加(注册)子应用 chapter01_HelloDjango5
'chapter01_HelloDjango5',
]
上述代码列出了项目路径 BASE_DIR、密钥配置 SECRET_KEY、调试模式 DEBUG、域名访问权限 ALLOWED_HOSTS 和子应用列表 INSTALLED_APPS,各个配置说明如下:
-
项目路径 BASE_DIR:主要通过 pathlib 模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无须修改。
-
密钥配置 SECRET_KEY:这是一个随机值,在项目创建的时候自动生成,一般情况下无须修改。主要用于重要数据的加密处理,提高项目的安全性,避免遭到攻击者恶意破坏。密钥主要用于用户密码、CSRF(Cross-Site Request Forgery,跨站请求伪造) 机制和会话 Session 等数据加密。
- 用户密码:Django 内置一套 Auth 认证系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户密码通过密钥进行加密处理,保证用户的安全性。
- CSRF 机制:该机制主要用于表单提交,防止窃取网站的用户信息来制造恶意请求。
- 会话 Session:Session 的信息存放在 Cookie 中,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
-
调试模式 DEBUG:该值为布尔类型。如果在开发调试阶段,那么应设置为 True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应将其改为 False,否则会泄漏项目的相关信息。
-
域名访问权限 ALLOWED_HOSTS:设置可访问的域名,默认值为空列表。当 DEBUG 为 True 并且 ALLOWED_HOSTS 为空列表时,项目只允许以 localhost 或 127.0.0.1 在浏览器上访问。当 DEBUG 为 False 时,ALLOWED_HOSTS 为必填项,否则程序无法启动,如果想允许所有域名访问,可设置
ALLOW_HOSTS = ['*']
。 当 ALLOWED_HOSTS 配置项取值为['*.hostname.cn', 'django.com']
, 表示只有当前这两个主机能访问当前项目。注意: 如果想要局域网内的其他主机也能访问此服务器,那么在启动服务器时应使用如下命令:shellpython manage.py runserver 0.0.0.0:8000
上述命令指定局域网内的所有主机都可以通过 8000 端口访问。此外,ALLOWED_HOSTS 需要设置为
['*']
。 -
子应用列表 INSTALLED_APPS:告诉 Django 有哪些子应用。在项目创建时已有 admin、auth 和 sessions 等配置信息,这些都是 Django 内置的应用功能,各个功能说明如下:
- admin: 内置的后台管理系统
- auth:内置的用户认证系统
- contenttypes:记录项目中所有 model 元数据(Django 的 ORM 框架)
- sessions:Session 会话功能,用于标识当前访问网站的用户身份,记录相关用户信息
- messages:消息提示功能
- staticfiles:查找静态资源路径
其中,创建子应用的命令为,startapp 命令类似于 startproject 命令,它是由 Django 框架定义的专门用于创建子应用的命令。注意 startapp 和 startproject 这两个命令的区别:startproject 命令用于创建 Django 项目,而 startapp 用于创建 Django 子应用(App)。 在创建好一个 Django 项目后,可以继续在该项目内创建 Django 应用,Django 应用相当于 Django 项目内的功能模块。因此,一个 Django 项目内可以包含一个或多个 Django 应用(一对多的关系)。另外,基于 Django 框架的设计模式,一个 Django 应用可以为多个 Django 项目所使用,相当于该个 Django 应用是一个公共模块(多对一的关系)。可见,Django 应用的使用是非常灵活的。如果在项目中创建了 App,就必须在 App 列表 INSTALLED_APPS 添加 App 名称。在 Django5Study 项目中新建 chapter02_DjangoSettings App,然后将已创建的 chapter02_DjangoSettings App 添加到 App 列表,代码如下:
python# 1.使用命令创建 chapter02_DjangoSettings App # PS D:\Code\dream\PythonStudy\Django5Study> python .\manage.py startapp chapter02_DjangoSettings # 2.添加App到App列表中 # Application definition # 子应用列表 INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", # TODO 1.添加(注册)子应用 chapter01_HelloDjango5 'chapter01_HelloDjango5', # TODO 2024-11-14.添加(注册)子应用 chapter02_DjangoSettings 'chapter02_DjangoSettings', ]
二、资源文件配置
资源文件配置分为静态资源和媒体资源。静态资源的配置方式由配置属性 STATIC_URL、STATICFILES_DIRS 和 STATIC_ROOT 进行设置;媒体资源的配置方式由配置属性 MEDIA_URL 和 MEDIA_ROOT 决定。
2.1 资源路由------STATIC_URL
静态资源指的是网站中不会改变的文件。在一般的应用程序中,静态资源包括 CSS 文件、JavaScript 文件以及图片等资源文件。此处简单介绍 CSS 和 JavaScript 文件。
CSS 也称层叠样式表(Cascading Style Sheets),是一种用来表现 HTML(标准通用标记语言的一个应用)或 XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。JavaScript 是一种直译式脚本语言,也是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML(标准通用标记语言下的一个应用)网页上使用的,用来给 HTML 网页增加动态功能。
一个项目在开发过程中肯定需要使用 CSS 和 JavaScript 文件,这些静态文件的存放主要由配置文件 settings.py 设置,Django 默认配置信息如下:
python
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.1/howto/static-files/
STATIC_URL = "static/
上述配置是设置静态资源的路由地址,其作用是通过浏览器访问 Django 的静态资源。默认情况下,Django 只能识别项目应用 App 的 static 文件夹里面的静态资源。当项目启动时,Django 会从项目应用 App 里面查找相关的资源文件,查找功能主要由 App 列表 INSTALLED_APPS 的 staticfiles 实现。在 chapter02_DjangoSettings App 中创建 static 文件夹并在文件夹中放置图片 lxf.jpg(打错了----知道是我们的女神刘亦菲就好,懒得改了),如下图所示:
Django 在调试模式(DEBUG=True)下只能识别项目应用 App 的 static 文件夹里面的静态资源,如果该文件夹改为其他名字,Django 就无法识别,若将 static 文件夹放在 MyDjango 的项目目录下,则 Django 也是无法识别的,如下图所示:
为了进一步验证 Django 在调试模式(DEBUG=True)下只能识别项目应用 App 的 static 文件夹,我们在 chapter02_DjangoSettings 文件夹里创建 DjangoSettingsStatic 文件夹并放置图片 hsx.jpeg,在 Django5Study 的根目录下创建 static 文件夹并放置图片 lye.jpg。最终,整个 Django5Study 的静态资源文件夹有:static(在 chapter02_DjangoSettings 文件夹)、DjangoSettingsStatic(在 chapter02_DjangoSettings 文件夹)和 static(在 Django5Study 的根目录),如下图所示:
启动 Django5Study 并在浏览器上分别访问 http://127.0.0.1:8000/static/lxf.jpg、http://127.0.0.1:8000/static/hsx.jpeg 和 http://127.0.0.1:8000/static/lye.jpg,可以发现只有 lxf.jpg 能正常访问,而 hsx.jpeg 和 lye.jpg 无法访问,如下图所示:
从上述例子说明,若资源路由 STATIC_URL 的值为 "static/"
,则浏览器访问静态资源的网站必须为 static,否则无法访问,并且 Django 在调试模式(DEBUG=True)下只能识别 App 目录下的 static 文件夹。
2.2 资源集合------STATICFILES_DIRS
由于 STATIC_URL 的特殊性,在开发中会造成诸多不便,比如将静态文件夹存放在项目的根目录以及定义多个静态文件夹等。以 Django5Study 为例,若想在网页上正常访问图片 hsx.jpeg 和 lye.jpg,可以将根目录的 static 文件夹和 chapter02_DjangoSettings 的 DjangoSettingsStatic 文件夹写入资源集合 STATICFILES_DIRS。在配置文件 settings.py 中设置 STATICFILES_DIRS 属性。该属性以列表的形式表示,设置方式如下:
python
# 设置根目录的静态资源文件夹static
STATICFILES_DIRS = [
BASE_DIR / 'static',
# 设置App(chapter02_DjangoSettings)的静态资源文件夹DjangoSettingsStatic
BASE_DIR / 'chapter02_DjangoSettings/DjangoSettingsStatic',
]
再次启动 Django5Study 并在浏览器上分别访问图片 lxf.jpg、hsx.jpeg 和 lye.jpg,可以发现三者都能正常访问,如下图所示:
浏览器访问图片的时候,图片路径皆为 http://127.0.0.1:8000/static/xxx.jpg ,图片路径的 static 是指资源路径 STATIC_URL 的值,若将 STATIC_URL 的值改为 Allstatic,则再次重启 MyDjango 项目并在浏览器上将图片资源路径的 static 改为 allStatic 即可,如下:
python
# STATIC_URL = "static/"
STATIC_URL = "allStatic/"
# http://127.0.0.1:8000/allStatic/lye.jpg
# http://127.0.0.1:8000/allStatic/hsx.jpeg
# http://127.0.0.1:8000/allStatic/lxf.jpg
2.3 资源部署------STATIC_ROOT
静态资源配置还有 STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT 主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。STATIC_ROOT 配置如下:
python
STATIC_ROOT = BASE_DIR / 'allStatic'
当项目的配置属性 DEBUG 设为 True 的时候,Django 会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用 STATIC_ROOT。当配置属性 DEBUG 设为 False 的时候,意味着项目进入生产环境,Django 不再提供静态文件代理服务,此时需要在项目的配置文件中设置 STATIC_ROOT。设置 STATIC_ROOT 需要使用 Django 操作指令 collectstatic 来收集所有静态资源,这些静态资源都会保存在 STATIC_ROOT 所设置的文件夹里。关于 STATIC_ROOT 的使用会在后续的文章详细讲述。
2.2.4 媒体资源------MEDIA
一般情况下,STATIC_URL 是设置静态文件的路由地址,如 CSS 样式文件、JavaScript 文件以及常用图片等。对于一些经常变动的资源,通常将其存放在媒体资源文件夹,如用户头像、歌曲文件等。媒体资源和静态资源是可以同时存在的,而且两者可以独立运行,互不影响,而媒体资源只有配置属性 MEDIA_URL 和 MEDIA_ROOT。以 Django5Study 为例,在 Django5Study 的根目录下创建 media 文件夹并存放图片 lyf.jpg,如下图所示:
然后在配置文件 settings.py 里设置配置属性 MEDIA_URL 和 MEDIA_ROOT,MEDIA_URL 用于设置媒体资源的路由地址,MEDIA_ROOT 用于获取 media 文件夹在计算机系统的完整路径信息,如下所示:
python
# 设置媒体路由地址信息
MEDIA_URL = 'media/'
# 获取media文件夹的完整路径信息
MEDIA_ROOT = BASE_DIR / 'media'
配置属性设置后,还需要将 media 文件夹注册到 Django 里,让 Django 知道如何找到媒体文件,否则无法在浏览器上访问该文件夹的文件信息。打开 Django5Study 文件夹的 urls.py 文件,为媒体文件夹 media 添加相应的路由地址,代码如下:
python
from django.contrib import admin
from django.urls import path, re_path
from chapter01_HelloDjango5.views import hello_django5
# 配置媒体文件夹media
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path("admin/", admin.site.urls),
path("", hello_django5),
# 配置媒体文件的路由地址
re_path('media/(?P<path>.*)', serve,
{'document_root': settings.MEDIA_ROOT}, name='media'),
]
最后再次启动 MyDjango,并在浏览器上访问 http://127.0.0.1:8000/media/lyf.jpg 和 http://127.0.0.1:8000/allStatic/lxf.jpg,发现两者皆可正常访问,如下图所示:
三、模板配置
在 Web 开发中,模板是一种较为特殊的 HTML 文档。这个 HTML 文档嵌入了一些能够让 Django 识别的变量和指令,然后由 Django 的模板引擎解析这些变量和指令,生成完整的 HTML 网页并返回给用户浏览。模板是 Django 里面的 MTV 框架模式的 T 部分,配置模板路径是告诉 Django 在解析模板时,如何找到模板所在的位置。创建项目时,Django 已有初始的模板配置信息,如下所示:
python
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
# TODO 2.配置模板文件夹的路径
"DIRS": [BASE_DIR / 'templates', ],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
模板配置是以列表格式呈现的,每个元素具有不同的含义,其含义说明如下:
- BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有 Django Templates 和 Jinja2,每个模板引擎都有自己的变量和指令语法。
- DIRS:设置模板所在路径,告诉 Django 在哪个地方查找模板的位置,默认为空列表。
- APP_DIRS:是否在 App 里查找模板文件。
- OPTIONS:用于填充在 RequestContext 的上下文(模板里面的变量和指令),一般情况下不做任何修改。
模板配置通常配置 DIRS 的属性值即可,在项目的根目录和 chapter02_DjangoSettings 下分别创建 templates 文件夹,并在文件夹下分别创建文件 helloDjango5.html 和 chapter02_DjangoSettings.html,如下图所示:
一般情况下,根目录的 templates 通常存放共用的模板文件,能为各个 App 的模板文件调用,这个模式符合代码重复使用原则。根据上图的文件夹设置,配置属性 TEMPLATES 的配置信息如下:
python
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
# TODO 2024-11-14.注册根目录和chapter02_DjangoSettings的templates文件夹
"DIRS": [BASE_DIR / 'templates',
BASE_DIR / 'chapter02_DjangoSettings/templates'],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
四、数据库配置
本小节讲述如何使用 mysqlclient 和 pymysql 模块实现 Django 与 MySQL 数据库通信连接,并且简单介绍单个项目实现多个数据库连接方式。
4.1 mysqlclient连接MySQL
数据库配置是选择项目所使用的数据库的类型,不同的数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django 提供4种数据库引擎:
python
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
项目创建时默认使用 Sqlite3 数据库,这是一款轻型的数据库,常用于嵌入式系统开发,而且占用的资源非常少。Sqlite3 数据库配置信息如下:
python
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
如果把上述的连接信息改为 MySQL 数据库,首先安装 MySQL 连接模块,由于 mysqldb 不支持 Python 3,因此 Django 2.0 以上版本不再使用 mysqldb 作为 MySQL 的连接模块,而选择 mysqlclient 模块,但两者之间在使用上并没有太大的差异。在配置 MySQL 之前,需要安装 mysqlclient 模块。这里以 pip 安装方法为例,打开命令提示符窗口并输入安装指令 pip install mysqlclient,等待模板安装完成即可。
shell
(base) C:\Users\amoxiang>conda activate django5_study
(django5_study) C:\Users\amoxiang>d:
(django5_study) D:\>cd Code\dream\PythonStudy\Django5Study
(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip install mysqlclient
完成 mysqlclient 模块的安装后,在项目的配置文件 settings.py 中配置 MySQL 数据库连接信息,代码如下:
python
# DATABASES = {
# "default": {
# "ENGINE": "django.db.backends.sqlite3",
# "NAME": BASE_DIR / "db.sqlite3",
# }
# }
# TODO 2024-11-14 配置mysql数据库连接信息
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": 'django5study',
"USER": 'root',
"PASSWORD": '123456',
"HOST": '127.0.0.1',
"PORT": 3306,
}
}
为了验证数据库连接信息是否正确,我们使用数据库可视化工具 Navicat Premium 打开本地的 MySQL 数据库。在本地的 MySQL 数据库创建数据库 django5study,如下图所示:
刚创建的数据库 django5study 是一个空白的数据库,接着在终端下输入 Django 操作指令 python manage.py migrate 来创建 Django 内置功能的数据表。因为 Django 自带内置功能,如 Admin 后台系统、Auth 用户系统和会话机制等功能,这些功能都需要借助数据表实现,所以该操作指令可以将内置的迁移文件生成数据表,如下图所示:
最后在数据库可视化工具 Navicat Premium 里查看数据库 django5study 是否生成相应的数据表,如下图所示:
使用 mysqlclient 连接 MySQL 数据库时,Django 对 mysqlclient 版本有使用要求,打开 Django 的源码查看 mysqlclient 的版本要求,如下图所示:
一般情况下,使用 pip 安装 mysqlclient 模块就能符合 Django 的使用要求。如果在开发过程中发现 Django 提示 mysqlclient 过低,那么可以对 Django 的源码进行修改,将上图所示的 if 条件判断注释即可。
4.2 pymysql连接MySQL
除了使用 mysqlclient 模块连接 MySQL 之外,还可以使用 pymysql 模块连接 MySQL 数据库。pymysql 模块的安装使用 pip 在线安装即可,在命令提示符窗口下输入 pip install pymysql 指令并等待安装完成即可。
python
(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip install pymysql
Collecting pymysql
Downloading PyMySQL-1.1.1-py3-none-any.whl.metadata (4.4 kB)
Downloading PyMySQL-1.1.1-py3-none-any.whl (44 kB)
Installing collected packages: pymysql
Successfully installed pymysql-1.1.1
pymysql 模块安装成功后,项目配置文件 settings.py 的数据库配置信息无须修改,只要在 Django5Study 文件夹的 __init__.py
中设置数据库连接模块即可,代码如下:
python
# Django5Study文件夹的__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
若要验证 pymysql 模块连接 MySQL 数据库的功能,可以将 mysqlclient 模块先行卸载,这样能排除干扰因素,而验证方式与 mysqlclient 模块连接 MySQL 的验证方式一致。记得在验证之前,务必将数据库 django5study 的数据表删除,具体的验证过程不再重复讲述。
shell
(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip uninstall mysqlclient
Found existing installation: mysqlclient 2.2.6
Uninstalling mysqlclient-2.2.6:
Would remove:
c:\users\amoxiang\.conda\envs\django5_study\lib\site-packages\mysqlclient-2.2.6.dist-info\*
c:\users\amoxiang\.conda\envs\django5_study\lib\site-packages\mysqldb\*
Proceed (Y/n)? Y
Successfully uninstalled mysqlclient-2.2.6
(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip list
Package Version
----------------- -------
asgiref 3.8.1
asttokens 2.4.1
colorama 0.4.6
decorator 5.1.1
Django 5.1.3
executing 2.1.0
ipython 8.29.0
jedi 0.19.2
matplotlib-inline 0.1.7
parso 0.8.4
pip 24.2
prompt_toolkit 3.0.48
pure_eval 0.2.3
Pygments 2.18.0
PyMySQL 1.1.1
setuptools 75.1.0
six 1.16.0
sqlparse 0.5.1
stack-data 0.6.3
traitlets 5.14.3
tzdata 2024.2
wcwidth 0.2.13
wheel 0.44.0
Django 除了支持 PostgreSQL、SQLite3、MySQL 和 Oracle 之外,还支持 SQL Server 和 MongoDB 的连接。由于不同的数据库有不同的连接方式,因此此处不过多介绍,本文主要以 MySQL 连接为例,若需了解其他数据库的连接方式,则可自行搜索相关资料。关于 Redis 的连接,后续会在专栏的项目篇讲解到。
4.3 多个数据库的连接方式
在一个项目里可能需要使用多个数据库才能满足开发需求,特别对于数据量过大的系统,单个数据库存储的数据越多就会使服务器负载越大,因此会将数据划分成多个数据库服务器共同存储,若 Django 想利用这些数据开发功能系统,则需要对各个数据库服务器进行连接。从 Django 单个数据库连接信息看到,配置属性 DATABASES 的属性值是以字典的格式表示的,字典里的每一对键值代表连接某一个数据库。因此,我们在配置属性 DATABASES 里设置多对键值对即可实现多个数据库连接,实现代码如下:
python
# Database
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
# TODO 2024-11-14 配置mysql数据库连接信息
DATABASES = {
# 默认数据库
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
},
# 第二个数据库
"chapter01_HelloDjango5": {
"ENGINE": "django.db.backends.mysql",
"NAME": 'chapter01_HelloDjango5',
"USER": 'root',
"PASSWORD": '123456',
"HOST": '127.0.0.1',
"PORT": 3306,
},
# 第三个数据库
"chapter02_DjangoSettings": {
"ENGINE": "django.db.backends.mysql",
"NAME": 'chapter02_DjangoSettings',
"USER": 'root',
"PASSWORD": '123456',
"HOST": '127.0.0.1',
"PORT": 3306,
}
}
上述代码共连接了三个数据库,分别是 sqlite3、chapter01_HelloDjango5 和 chapter02_DjangoSettings。chapter01_HelloDjango5 和 chapter02_DjangoSettings 均属于 MySQL 数据库系统,sqlite3 属于 sqlite3 数据库系统。配置属性 DATABASES 设有3个键值对:default、 chapter01_HelloDjango5 和 chapter02_DjangoSettings,每个键值对代表 Django 连接了某个数据库。若项目中连接了多个数据库,则数据库之间的使用需要遵从一定的规则和设置。比如项目中定义了多个模型,每个模型所对应的数据表可以选择在某个数据库中生成,如果模型没有指向某个数据库,模型就会在 key 为 default 的数据库里生成。
4.4 使用配置文件动态连接数据库
在大多数情况下,我们都是在 settings.py 中配置数据库的连接方式,但每次修改 settings.py 的配置属性都要重新启动 Django,否则修改内容就无法生效。当项目运行上线之后,为了保证在系统不中断的情况下切换到另一个数据库,可以将数据库的连接方式写到配置文件中,这样无须修改 settings.py 的配置属性即可达成顺利切换数据的目的。我们在 Django5Study 的目录下创建配置文件 my.cnf,即 D:\Code\dream\PythonStudy\Django5Study\my.cnf
,然后在配置文件 my.cnf 写入 MySQL 数据库的连接信息,代码如下所示:
python
# my.cnf
[client]
database=django5study
user=root
password=123456
host=127.0.0.1
port=3306
配置文件 my.cnf 中必须设置 [client],[client] 在配置信息中代表分组的意思,它是将一个或多个配置信息划分到某一个分组里面。在 [client] 里面,每个配置信息分别代表 MySQL 的数据库名称、用户名、密码、IP地址和端口信息。下一步在 Django 的配置文件 settings.py 中编写 DATABASES 的配置信息,其代码如下:
python
# TODO 2024-11-14 11:30 通过配置文件动态连接数据库
DATABASES = {
# 默认数据库
"default": {
"ENGINE": "django.db.backends.mysql",
"OPTIONS": {'read_default_file': str(BASE_DIR / 'my.cnf')},
},
}
从 DATABASES 的配置信息看到,我们只需在 default ⇒ OPTIONS ⇒ read_default_file 设置配置文件 my.cnf 的地址路径即可,Django 会自动读取配置文件 my.cnf 的数据库连接信息,从而实现数据库连接。为了验证能否使用配置文件 my.cnf 实现数据库连接,在 Django5Study 的 urls.py 中设置路由 chapter02_DjangoSettings:
python
from django.contrib import admin
from django.urls import path, re_path
from chapter01_HelloDjango5.views import hello_django5
# TODO 2024-11-14 11:39 导入视图函数
from chapter02_DjangoSettings.views import chapter02_django_settings
# 配置媒体文件夹media
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path("admin/", admin.site.urls),
path("", hello_django5),
# 配置媒体文件的路由地址
re_path('media/(?P<path>.*)', serve,
{'document_root': settings.MEDIA_ROOT}, name='media'),
# TODO 2024-11-14 11:39 设置路由
path("chapter02_DjangoSettings/", chapter02_django_settings, name='chapter02_DjangoSettings'),
]
路由的视图函数 chapter02_django_settings() 在项目应用 chapter02_DjangoSettings 的 view.py 中定义,代码如下:
python
from django.shortcuts import render
from django.contrib.contenttypes.models import ContentType
# Create your views here.
def chapter02_django_settings(request):
c = ContentType.objects.values_list().all()
print(c)
return render(request, 'chapter02_DjangoSettings.html')
视图函数 chapter02_django_settings() 读取并输出 Django 内置模型 ContentType 的数据,并从模板文件夹 templates 的 chapter02_DjangoSettings.html 作为当前请求的响应内容。测试前先将 django5study 数据库给删掉,免得影响效果。 启动 Django5Study 之前,需要使用 Django 内置指令创建数据表,打开终端,确保窗口的当前路径是 Django5Study 目录,然后输入 python manage.py migrate 指令,Django 会自动创建内置数据表,如下图所示:
数据表创建成功后,我们启动 Django5Study,然后在浏览器访问 http://127.0.0.1:8000/chapter02_DjangoSettings/,在 PyChram 的 Run 窗口下看到当前的请求信息以及视图函数 chapter02_django_settings() 输出模型 ContentType 的数据信息,如下图所示:
4.5 通过SSH隧道远程连接MySQL
在企业开发中,数据库和 Web 系统很可能部署在不同的服务器,当 Web 系统连接数据库的时候,如果数据库所在的服务器禁止了外网直连,只允许通过 SSH 方式连接服务器,再从已连接服务器的基础上连接数据库,遇到这一种情况,如何在 Django 中实现数据库连接呢?为了清楚理解 SSH 连接数据库的实现过程,我们使用数据库可视化工具 Navicat Premium 演示如何通过 SSH 连接数据库。首先打开 Navicat Premium 连接 MySQL 的界面,然后单击 "SSH"
选项,在 SSH 连接界面输入服务器的连接信息,如下图所示:
然后切换到 "常规"
界面,输入服务器里面 MySQL 的连接信息,如下图所示。最后单击 "确定"
按钮即可完成整个连接过程。
既然数据库只允许 SSH 方式连接,我们只能通过这种方式实现数据库连接,首先使用 pip 指令下载 sshtunnel 模块,该模块能通过 SSH 方式连接到目标服务器,生成服务器的 SSH 连接对象:
shell
(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip install sshtunnel
然后在 Django 的配置文件 settings.py 的 DATABASES 中设置数据库连接,实现过程如下:
python
from sshtunnel import open_tunnel
# 数据库服务器的ip地址或主机名
ssh_host = "XXX.XXX.XXX.XXX"
# 数据库服务器的SSH连接端口号,一般都是22,必须是数字
ssh_port = 22
# 数据库服务器的用户名
ssh_user = "root"
# 数据库服务器的用户密码
ssh_password = "123456"
# 数据库服务器的mysql的主机名或 ip 地址
mysql_host = "localhost"
# 数据库服务器的mysql的端口,默认为3306,必须是数字
mysql_port = 6603
# 数据库服务器的mysql的用户名
mysql_user = "root"
# 数据库服务器的mysql的密码
mysql_password = "123456"
# 数据库服务器的mysql的数据库名
mysql_db = "Django5Study"
def get_ssh():
server = open_tunnel((ssh_host, ssh_port),
ssh_username=ssh_user,
ssh_password=ssh_password,
# 绑定服务器的 MySQL 数据库
remote_bind_address=(mysql_host, mysql_port))
# ssh通道服务启动
server.start()
return str(server.local_bind_port)
DATABASES = {
# 默认数据库
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": mysql_db,
"USER": mysql_user,
"PASSWORD": mysql_password,
"HOST": mysql_host,
"PORT": get_ssh(),
},
}
上述代码中,我们分别设定了两组不同的 IP 地址、用户名和密码等信息,每组配置信息说明如下:
- 带有 ssh_ 开头的配置信息是实现 SSH 连接目标服务器,主要在 sshtunnel 模块中使用。
- 带有 mysql_ 开头的配置信息是在目标服务器基础上连接 MySQL 数据库,在配置属性 DATABASES 和 sshtunnel 模块中均被使用。
从整个配置过程可以看出,Django 使用 SSH 连接服务器的 MySQL 过程如下:
- 分别定义服务器的 SSH 连接信息和数据库的连接信息。
- 定义服务器的 SSH 连接函数 get_ssh(),使用 sshtunnel 模块的 open_tunnel 函数实现,并设置相应的函数参数,其中参数 remote_bind_address 是绑定服务器的 MySQL 数据库。
- 在配置属性 DATABASES 的 PORT 调用 get_ssh(),Django 自动根据 DATABASES 的 PORT 连接到服务器的 MySQL 数据库。
五、中间件
中间件(Middleware)是一个用来处理 Django 的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变 Django 的输入和输出。当用户在网站中进行某个操作时,这个过程是用户向网站发送 HTTP 请求(Request);而网站会根据用户的操作返回相关的网页内容,这个过程称为响应处理(Response)。从请求到响应的过程中,当 Django 接收到用户请求时,首先经过中间件处理请求信息,执行相关的处理,然后将处理结果返回给用户。中间件的执行流程如下图所示:
从上图中能清晰地看到,中间件的作用是处理用户请求信息和返回响应内容。开发者可以根据自己的开发需求自定义中间件,只要将自定义的中间件添加到配置属性 MIDDLEWARE 中即可激活。一般情况下,Django 默认的中间件配置均可满足大部分的开发需求。我们在项目的 MIDDLEWARE 中添加 LocaleMiddleware 中间件,使得 Django 内置的功能支持中文显示,代码如下:
python
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
# TODO 2024-11-14 12:23 添加中间件LocaleMiddleware
'django.middleware.locale.LocaleMiddleware',
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
配置属性 MIDDLEWARE 的数据格式为列表类型,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常。每个中间件的说明如下:
- SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
- SessionMiddleware:会话 Session 功能。
- LocaleMiddleware:国际化和本地化功能。
- CommonMiddleware:处理请求信息,规范化请求内容。
- CsrfViewMiddleware:开启 CSRF 防护功能。
- AuthenticationMiddleware:开启内置的用户认证系统。
- MessageMiddleware:开启内置的信息提示功能。
- XFrameOptionsMiddleware:防止恶意程序单击劫持。