[Python]Django 配置和静态文件(三)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: [Python]Django 配置和静态文件(三)

🍉 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项目配置工程日志


🍇🍈🍑🍒🍓🍉🍊🍋🥝🍅🍌🍍🥭🍎🥑🥥🍆🍏🍐🥔🥜🧅🧄🥦🥬🥒🌶🌽🥕🌰

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
268 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
27天前
|
安全 网络安全 数据安全/隐私保护
|
23天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
125 45
|
12天前
|
JSON Shell Linux
配置Python的环境变量可
配置Python的环境变量
35 4
|
24天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
35 2
|
27天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
38 1
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
30 4
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第10天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django以功能全面、文档完善著称,适合快速开发;Flask轻量灵活,易于上手;Pyramid介于两者之间,兼顾灵活性和安全性。选择框架时需考虑项目需求和个人偏好。
36 1
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
36 4
|
1月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
331 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
下一篇
无影云桌面