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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: [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项目配置工程日志


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

相关文章
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
207 0
|
5月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
222 1
|
2月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
3月前
|
JavaScript 前端开发 机器人
【Azure Bot Service】在中国区Azure上部署机器人的 Python 版配置
本文介绍了在中国区Azure上使用Python SDK配置Azure Bot Service时遇到的问题及解决方案,涵盖参数设置与适配器配置,适用于希望在Azure中国区部署Python机器人的开发者。
123 6
|
4月前
|
存储 前端开发 应用服务中间件
Django 实战:静态文件与媒体文件从开发配置到生产部署
Django项目中,静态文件(Static Files)和媒体文件(Media Files)是两类不同用途的文件。本文详细介绍了它们的区别、配置方法以及在开发与生产环境中的处理方式,并结合用户头像上传功能进行实战演示,最后讲解了如何通过Nginx或OpenResty部署静态与媒体文件服务。
253 1
|
5月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
223 1
|
7月前
|
IDE 开发工具 开发者
手把手教你安装PyCharm 2025:开发者的Python IDE配置全流程+避坑指南
本教程详细介绍了PyCharm 2025版本在Windows系统下的安装流程及配置方法,涵盖AI代码补全与智能调试工具链等新功能。内容包括系统要求、安装步骤、首次运行配置(如主题选择与插件安装)、创建首个Python项目,以及常见问题解决方法。此外,还提供了切换中文界面和延伸学习资源的指导,帮助用户快速上手并高效使用PyCharm进行开发。
3709 61
|
6月前
|
Python
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
658 37
|
7月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
228 22