🍉 Django项目配置MySQL数据库
🍈 PyMySQL连接MySQL数据库
找到全局配置文件 settings.py 中的DATABASES配置项:
将原先的配置修改为如下配置:
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } # 将使用的数据库修改为MySQL 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用的数据库引擎修改MySQL 'HOST': '127.0.0.1', # mysql数据库所在的主机 'PORT': 3306, # mysql数据库监听的端口 'USER': 'username', # 登录数据库的用户名 'PASSWORD': '123456', # 登录数据库的密码 'NAME': 'database', # 使用的数据库名 } }
安装PyMySQL:
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
使用 pymysql 替代默认的MySQL数据库驱动程序 MySQLdb,在项目配置文件存储目录下的__init__.py 文件中添加如下代码:
from pymysql import install_as_MySQLdb install_as_MySQLdb()
执行数据库的迁移验证是否配置成功:
python .\manage.py makemigrations python .\manage.py migrate
🍈 配置多个数据库
从Django单个数据库连接信息看到,配置项DATABASES的值是以字典的形式表示的,字典里的每一对键值代表连接某一个数据库。因此,我们可以在配置项DATABASES里设置多对键值对即可实现多个数据库连接。
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } # 第一个数据库 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用的数据库引擎修改MySQL 'HOST': '127.0.0.1', # mysql数据库所在的主机 'PORT': 3306, # mysql数据库监听的端口 'USER': 'username', # 登录数据库的用户名 'PASSWORD': '123456', # 登录数据库的密码 'NAME': 'database1', # 使用的数据库名 }, # 第二个数据库 'user': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'username', 'PASSWORD': '123456', 'NAME': 'database2', }, # 第三个数据库 'sqlite': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
若项目中连接了多个数据库,则数据库之间的使用需要遵从一定的规则和设置。比如项目中定义了多个模型,每个模型所对应的数据表可以选择在某个数据库中生成,如果模型没有指向某个数据库,模型就会在key为default的数据库里生成。
🍈 使用配置文件动态连接数据库
一般,我们都是在settings.py配置文件中配置数据库的连接方式,但每次修改settings.py配置文件中的配置项都需要重新启动运行Django项目,否则修改内容就无法生效。当项目运行上线之后,为了保证在系统不中断的情况下切换到另一个数据库,可以将数据库的连接配置写到配置文件中,这样无须修改settings.py配置文件中的配置项即可达成顺利切换数据库的目的。
在项目配置文件存放目录下新建mysql.cnf配置文件:
在mysql.cnf配置文件中写入如下配置:
# mysql.cnf # 配置文件my.cnf中必须设置[client], # [client]在配置信息中代表分组的意思, # 是将一个或多个配置信息划分到某一个分组里面。 # 在[client]里面,每个配置信息分别代表 # MySQL的数据库名称、用户名、密码、IP地址和端口信息。 [client] database=testdb user=root password=123456 host=127.0.0.1 port=3306
修改项目配置文件settings.py中DATABASES配置项的配置:
# Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases DATABASES = { # 默认数据库配置 # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } # 连接mysql数据库配置 # 'default': { # 'ENGINE': 'django.db.backends.mysql', # 使用的数据库引擎修改MySQL # 'HOST': '127.0.0.1', # mysql数据库所在的主机 # 'PORT': 3306, # mysql数据库监听的端口 # 'USER': 'username', # 登录数据库的用户名 # 'PASSWORD': '123456', # 登录数据库的密码 # 'NAME': 'database', # 使用的数据库名 # }, # 配置文件动态连接mysql数据库 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用的数据库引擎为MySQL 'OPTIONS': { 'read_default_file': str(os.path.join(BASE_DIR, 'django_pro/mysql.cnf')), } } }
测试配置是否成功:
在子应用test_app/models.py中写入以下代码:
from django.db import models # Create your models here. class MyModel(models): id = models.AutoField(primary_key=True) name = models.CharField(max_length=20, blank=True)
进行数据库的迁移验证配置是否成功:
如果报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 35: illegal multibyte sequence
,是'read_default_file': str(os.path.join(BASE_DIR, 'django_pro/mysql.cnf')),
读取文件使用的编码方式为gbk,而mysql.cnf使用的编码方式不为gbk,把mysql.cnf的编码方式修改gbk即可。
pycharm右下角
python .\manage.py makemigrations python .\manage.py migrate
🍈 通过SSH连接MySQL
如果数据库所在的服务器禁止了外网直连,只允许通过SSH方式连接服务器,再从已连接服务器的基础上连接数据库。
安装sshtunnel:
该模块能通过SSH方式连接到目标服务器,生成服务器的SSH连接对象,然后在Django的配置文件settings.py的DATABASES中设置数据库连接
pip install sshtunnel -i https://pypi.tuna.tsinghua.edu.cn/simple
在settings.py配置文件中进行如下配置:
# 带有ssh_开头的配置信息是实现SSH连接目标服务器,主要在sshtunnel模块中使用。 # 带有mysql_开头的配置信息是在目标服务器基础上连接MySQL数据库 ssh_host = '127.0.0.1' # 服务器的ip或主机名 ssh_port = 22 # ssh连接服务器的端口号,一般为22 # 可以登录服务器主机的用户 ssh_user = 'cw' # 连接服务器的用户名 ssh_password = '123456' # 连接服务器的密码 mysql_host = 'localhost' # mysql在服务器主机上 mysql_port = 3306 # 连接mysql的端口号,一般为3306 # 服务器上可以登录mysql的用户 mysql_user = 'root' # 连接mysql的用户名 mysql_password = '123456' # 连接mysql的密码 mysql_db = 'testdb' # mysql数据库名 from sshtunnel import open_tunnel def get_ssh(): server = open_tunnel( (ssh_host, ssh_port), ssh_username=ssh_user, ssh_password=ssh_password, remote_bind_address=(mysql_host, mysql_port) ) server.start() return server.local_bind_port BATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用的数据库引擎MySQL 'NAME': mysql_db, # 使用的数据库名 'USER': mysql_user, # 登录数据库的用户名 'PASSWORD': mysql_password, # 登录数据库的密码 'HOST': mysql_host, # mysql数据库所在的主机 'PORT': get_ssh(), # mysql数据库监听的端口 } }
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
中间件(Middleware)是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。
配置文件settings.py中MIDDLEWARE配置项的数据类型为列表类型。
注意,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常
创建Django项目之后,Django会默认配置一些中间件:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
● SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
● SessionMiddleware:会话Session功能。
● CommonMiddleware:处理请求信息,规范化请求内容。
● CsrfViewMiddleware:开启CSRF防护功能。
● AuthenticationMiddleware:开启内置的用户认证系统。
● MessageMiddleware:开启内置的信息提示功能。
● XFrameOptionsMiddleware:防止恶意程序单击劫持。
中间件的执行流程:
🍉 Django项目配置Redis数据库
django 配置 redis 文档:django-redis 中文文档
安装 django-redis 包
pip install django-redis -i https://pypi.tuna.tsinghua.edu.cn/simple
在项目全局配置文件中新增CACHES配置项配置 redis 数据库:
与DATABASES平级
# 配置redis数据库 CACHES = { "default": { # 默认使用的redis数据库 # 使用redis作为缓存 "BACKEND": "django_redis.cache.RedisCache", # redis 数据库所在的主机地址 端口号 选择第几个数据库 "LOCATION": "redis://127.0.0.1:6379/0", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PASSWORD": "123123", # 访问redis数据库的密码 } }, # 分库存储不同的信息 # session 数据存在的redis数据库配置 "session": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PASSWORD": "123123", # 访问redis数据库的密码 } }, } # 配置session数据存储的redis数据库 SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "session"
运行项目:
🍉 添加项目的导包路径
在项目的全局配置文件中打印查看项目的导包路径:
import sys print(sys.path) # 查看项目当前的导包路径 print(BASE_DIR)
接下来准备把项目配置文件存放目录(BASE_DIR指向的目录)作为子应用的导包路径,即将子应用创建在项目目录下。由于导包路径中没有指向项目目录的路径,而BASE_DIR又指向项目目录,所以将BASE_DIR加入导包路径中。
from pathlib import Path import os import sys # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent # 新增导包路径 sys.path.insert(0, os.path.join(BASE_DIR)) print(sys.path) # 查看项目当前的导包路径 print(BASE_DIR)
在pycharm中将项目目录标记为导包的根目录:
在项目目录中新建apps包由于存放子应用:
🍉 将Django项目全局配置文件用统一的包进行管理
由于 manage.py 中第九行的代码:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_pro01.settings')
Django项目默认的开发环境的配置文件为项目配置文件存放目录下的 settings.py 文件。
在项目配置文件存放目录下新建用于管理项目配置文件的包 settings:
将项目的配置文件移动到用于管理项目配置文件的包中:
修改 manage.py 文件中项目全局配置文件导入的代码(第九行):
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_pro01.settings.settings')
运行项目:
Django项目配置工程日志
🍇🍈🍑🍒🍓🍉🍊🍋🥝🍅🍌🍍🥭🍎🥑🥥🍆🍏🍐🥔🥜🧅🧄🥦🥬🥒🌶🌽🥕🌰