Django5 2024全栈开发指南(二):Django项目配置详解

目录

  • 一、基本配置信息
  • 二、资源文件配置
    • 2.1 资源路由——STATIC_URL
    • 2.2 资源集合——STATICFILES_DIRS
    • 2.3 资源部署——STATIC_ROOT
    • 2.2.4 媒体资源——MEDIA
  • 三、模板配置
  • 四、数据库配置
    • 4.1 mysqlclient连接MySQL
    • 4.2 pymysql连接MySQL
    • 4.3 多个数据库的连接方式
    • 4.4 使用配置文件动态连接数据库
    • 4.5 通过SSH隧道远程连接MySQL
  • 五、中间件

Django 的配置文件 settings.py 用于配置整个网站的环境和功能,核心配置必须有项目路径、密钥配置、域名访问权限、子应用列表、中间件、资源文件、模板配置、数据库的连接方式。

一、基本配置信息

一个简单的项目必须具备的基本配置信息有:项目路径、密钥配置、域名访问权限、子应用列表和中间件。以 Django5Study 项目为例,settings.py 的基本配置如下:

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,各个配置说明如下:

  1. 项目路径 BASE_DIR:主要通过 pathlib 模块读取当前项目在计算机系统的具体路径,该代码在创建项目时自动生成,一般情况下无须修改。

  2. 密钥配置 SECRET_KEY:这是一个随机值,在项目创建的时候自动生成,一般情况下无须修改。主要用于重要数据的加密处理,提高项目的安全性,避免遭到攻击者恶意破坏。密钥主要用于用户密码、CSRF(Cross-Site Request Forgery,跨站请求伪造) 机制和会话 Session 等数据加密。

    • 用户密码:Django 内置一套 Auth 认证系统,该系统具有用户认证和存储用户信息等功能,在创建用户的时候,将用户密码通过密钥进行加密处理,保证用户的安全性。
    • CSRF 机制:该机制主要用于表单提交,防止窃取网站的用户信息来制造恶意请求。
    • 会话 Session:Session 的信息存放在 Cookie 中,以一串随机的字符串表示,用于标识当前访问网站的用户身份,记录相关用户信息。
  3. 调试模式 DEBUG:该值为布尔类型。如果在开发调试阶段,那么应设置为 True,在开发调试过程中会自动检测代码是否发生更改,根据检测结果执行是否刷新重启系统。如果项目部署上线,那么应将其改为 False,否则会泄漏项目的相关信息。

  4. 域名访问权限 ALLOWED_HOSTS:设置可访问的域名,默认值为空列表。当 DEBUG 为 True 并且 ALLOWED_HOSTS 为空列表时,项目只允许以 localhost 或 127.0.0.1 在浏览器上访问。当 DEBUG 为 False 时,ALLOWED_HOSTS 为必填项,否则程序无法启动,如果想允许所有域名访问,可设置 ALLOW_HOSTS = ['*'] 当 ALLOWED_HOSTS 配置项取值为 ['*.hostname.cn', 'django.com'] 表示只有当前这两个主机能访问当前项目。注意: 如果想要局域网内的其他主机也能访问此服务器,那么在启动服务器时应使用如下命令:

    python manage.py runserver 0.0.0.0:8000
    

    上述命令指定局域网内的所有主机都可以通过 8000 端口访问。此外,ALLOWED_HOSTS 需要设置为 ['*']

  5. 子应用列表 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 列表,代码如下:

    # 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 默认配置信息如下:

# 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 属性。该属性以列表的形式表示,设置方式如下:

# 设置根目录的静态资源文件夹static
STATICFILES_DIRS = [BASE_DIR / 'static',# 设置App(chapter02_DjangoSettings)的静态资源文件夹DjangoSettingsStaticBASE_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 即可,如下:

# 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 配置如下:

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 文件夹在计算机系统的完整路径信息,如下所示:

# 设置媒体路由地址信息
MEDIA_URL = 'media/'
# 获取media文件夹的完整路径信息
MEDIA_ROOT = BASE_DIR / 'media'

配置属性设置后,还需要将 media 文件夹注册到 Django 里,让 Django 知道如何找到媒体文件,否则无法在浏览器上访问该文件夹的文件信息。打开 Django5Study 文件夹的 urls.py 文件,为媒体文件夹 media 添加相应的路由地址,代码如下:

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 settingsurlpatterns = [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 已有初始的模板配置信息,如下所示:

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",],},},
]

模板配置是以列表格式呈现的,每个元素具有不同的含义,其含义说明如下:

  1. BACKEND:定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有 Django Templates 和 Jinja2,每个模板引擎都有自己的变量和指令语法。
  2. DIRS:设置模板所在路径,告诉 Django 在哪个地方查找模板的位置,默认为空列表。
  3. APP_DIRS:是否在 App 里查找模板文件。
  4. OPTIONS:用于填充在 RequestContext 的上下文(模板里面的变量和指令),一般情况下不做任何修改。

模板配置通常配置 DIRS 的属性值即可,在项目的根目录和 chapter02_DjangoSettings 下分别创建 templates 文件夹,并在文件夹下分别创建文件 helloDjango5.html 和 chapter02_DjangoSettings.html,如下图所示:
在这里插入图片描述
一般情况下,根目录的 templates 通常存放共用的模板文件,能为各个 App 的模板文件调用,这个模式符合代码重复使用原则。根据上图的文件夹设置,配置属性 TEMPLATES 的配置信息如下:

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种数据库引擎:

'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'

项目创建时默认使用 Sqlite3 数据库,这是一款轻型的数据库,常用于嵌入式系统开发,而且占用的资源非常少。Sqlite3 数据库配置信息如下:

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,等待模板安装完成即可。

(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 数据库连接信息,代码如下:

# 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 指令并等待安装完成即可。

(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip install pymysql
Collecting pymysqlDownloading 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 中设置数据库连接模块即可,代码如下:

# Django5Study文件夹的__init__.py文件
import pymysqlpymysql.install_as_MySQLdb()

若要验证 pymysql 模块连接 MySQL 数据库的功能,可以将 mysqlclient 模块先行卸载,这样能排除干扰因素,而验证方式与 mysqlclient 模块连接 MySQL 的验证方式一致。记得在验证之前,务必将数据库 django5study 的数据表删除,具体的验证过程不再重复讲述。

(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)? YSuccessfully 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 里设置多对键值对即可实现多个数据库连接,实现代码如下:

# 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 数据库的连接信息,代码如下所示:

# 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 的配置信息,其代码如下:

# 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:

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 settingsurlpatterns = [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 中定义,代码如下:

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 连接对象:

(django5_study) D:\Code\dream\PythonStudy\Django5Study>pip install sshtunnel

然后在 Django 的配置文件 settings.py 的 DATABASES 中设置数据库连接,实现过程如下:

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 地址、用户名和密码等信息,每组配置信息说明如下:

  1. 带有 ssh_ 开头的配置信息是实现 SSH 连接目标服务器,主要在 sshtunnel 模块中使用。
  2. 带有 mysql_ 开头的配置信息是在目标服务器基础上连接 MySQL 数据库,在配置属性 DATABASES 和 sshtunnel 模块中均被使用。

从整个配置过程可以看出,Django 使用 SSH 连接服务器的 MySQL 过程如下:

  1. 分别定义服务器的 SSH 连接信息和数据库的连接信息。
  2. 定义服务器的 SSH 连接函数 get_ssh(),使用 sshtunnel 模块的 open_tunnel 函数实现,并设置相应的函数参数,其中参数 remote_bind_address 是绑定服务器的 MySQL 数据库。
  3. 在配置属性 DATABASES 的 PORT 调用 get_ssh(),Django 自动根据 DATABASES 的 PORT 连接到服务器的 MySQL 数据库。

五、中间件

中间件(Middleware)是一个用来处理 Django 的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变 Django 的输入和输出。当用户在网站中进行某个操作时,这个过程是用户向网站发送 HTTP 请求(Request);而网站会根据用户的操作返回相关的网页内容,这个过程称为响应处理(Response)。从请求到响应的过程中,当 Django 接收到用户请求时,首先经过中间件处理请求信息,执行相关的处理,然后将处理结果返回给用户。中间件的执行流程如下图所示:

从上图中能清晰地看到,中间件的作用是处理用户请求信息和返回响应内容。开发者可以根据自己的开发需求自定义中间件,只要将自定义的中间件添加到配置属性 MIDDLEWARE 中即可激活。一般情况下,Django 默认的中间件配置均可满足大部分的开发需求。我们在项目的 MIDDLEWARE 中添加 LocaleMiddleware 中间件,使得 Django 内置的功能支持中文显示,代码如下:

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 的数据格式为列表类型,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常。每个中间件的说明如下:

  1. SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
  2. SessionMiddleware:会话 Session 功能。
  3. LocaleMiddleware:国际化和本地化功能。
  4. CommonMiddleware:处理请求信息,规范化请求内容。
  5. CsrfViewMiddleware:开启 CSRF 防护功能。
  6. AuthenticationMiddleware:开启内置的用户认证系统。
  7. MessageMiddleware:开启内置的信息提示功能。
  8. XFrameOptionsMiddleware:防止恶意程序单击劫持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474077.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

黑马智数Day10

项目背景说明 后台管理部分使用的技术栈是Vue2&#xff0c;前台可视化部分使用的技术栈是Vue3 前台可视化项目不是独立存在&#xff0c;而是和后台管理项目共享同一个登录页面 微前端的好处 微前端是一种前端架构模式&#xff0c;它将大型单体应用程序分解为小的、松散耦合的…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

prop校验,prop和data区别

prop:组件上注册的一些自定义属性 prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量&#xff0c;任意类型的prop 父组件 &#xff08;一个个地传递比较麻烦&#xff0c;可以直接打包成一个对象传过去&#xff0c;然后通过点属性接收&#xff09; <t…

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …

跨平台WPF框架Avalonia教程 一

安装 安装 Avalonia UI 模板​ 开始使用 Avalonia 的最佳方式是使用模板创建一个应用程序。 要安装 Avalonia 模板&#xff0c;请运行以下命令&#xff1a; dotnet new install Avalonia.Templates 备注 对于 .NET 6.0 及更早版本&#xff0c;请将 install 替换为 --inst…

UE5 材质里面画圆锯齿严重的问题

直接这么画圆会带来锯齿&#xff0c;我们对锯齿位置进行模糊 可以用smoothstep&#xff0c;做值的平滑过渡&#xff08;虽然不是模糊&#xff0c;但是类似&#xff09;

【MySql】实验十六 综合练习:图书管理系统数据库结构

文章目录 创建图书管理系统数据库结构一、创建数据表1.1 book表1.2 reader表1.3 borrow表 二、插入示例数据2.1 向book表插入数据2.2 向reader表插入数据2.3 向borrow表插入数据 三、查询操作3.1 根据语义为借书表borrow的bno列和 rno列建立外键3.2 查询张小海编写的“数据库原…

QT QLabel双击事件

新建类&#xff1a; DoubleClickLabel .h #pragma once#include <QLabel>class DoubleClickLabel : public QLabel {Q_OBJECTpublic:DoubleClickLabel(QWidget *parent);~DoubleClickLabel(); signals:void doubleClicked();protected: //这里重写双击事件virtual v…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…

【学习笔记】科学计算

[pytorch 加速] CPU传输 & GPU计算的并行&#xff08;pin_memory&#xff0c;non_blocking&#xff09; https://www.bilibili.com/video/BV15Xxve1EtZ from IPython.display import Image import os os.environ[http_proxy] http://127.0.0.1:7890 os.environ[https_pr…

2、计算机网络七层封包和解包的过程

计算机网络osi七层模型 1、网络模型总体预览2、数据链路层4、传输层5.应用层 1、网络模型总体预览 图片均来源B站&#xff1a;网络安全收藏家&#xff0c;没有本人作图 2、数据链路层 案例描述&#xff1a;主机A发出一条信息&#xff0c;到路由器A&#xff0c;这里封装目标MAC…

在云服务器搭建 Docker

操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统&#xff0c;刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息&#xff0c;请参见 Docker 官方。 说明&#xff1a; Windows Subsystem for Linux&#xff…

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

【时间之外】IT人求职和创业应知【37】-AIGC私有化

目录 新闻一&#xff1a;2024智媒体50人成都会议暨每经20周年财经媒体峰会召开 新闻二&#xff1a;全球机器学习技术大会在北京召开 新闻三&#xff1a;区块链技术在金融领域的应用取得新突破 不知不觉的坚持了1个月&#xff0c;按照心理学概念&#xff0c;还要坚持2个月&am…

亿咖通科技应邀出席微软汽车行业智享会,分享ECARX AutoGPT全新实践

11月14日&#xff0c;全球出行科技企业亿咖通科技&#xff08;纳斯达克股票代码&#xff1a;ECX&#xff09;应邀于广州参加由微软举行的汽车行业智享会&#xff0c;揭晓了亿咖通科技对“AI定义汽车”时代的洞察与技术布局&#xff0c;分享了亿咖通科技汽车垂直领域大模型ECARX…

三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点

在3D重建应用中&#xff0c;很重要的一个场景是找到两幅图像中的同名特征点&#xff0c;这个过程需要对特征点进行提取和描述。 从上面描述可以看出&#xff0c;如果窗口处于颜色变化不明显或者没有变化的区域&#xff0c;E的值很小或为0&#xff1b;如果窗口处于边缘位置&…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

Skywalking搭建-来自于图灵课堂

Skywalking主要用于链路追踪&#xff0c;日志收集查看&#xff0c;异常日志查看&#xff0c;服务监控弱一些&#xff0c;服务器监控可以使用prometheus 一、搭建服务端&#xff0c;使用startup.bat启动 配置持久化&#xff0c;如果是用mysql持久化&#xff0c;拷贝mysql链接包…