在 Django 项目中配置多个环境的 MySQL 数据库是一个常见的需求,特别是在开发、测试和生产环境中使用不同的数据库配置。你可以通过在 settings.py
文件中使用条件语句或环境变量来实现这一点。
1. 使用环境变量
使用环境变量是一种灵活且安全的方式来配置多个环境的数据库。你可以使用 django-environ
库来简化环境变量的管理。
安装 django-environ
首先,安装 django-environ
库:
pip install django-environ
配置 settings.py
编辑 settings.py
文件,使用 environ
来读取环境变量:
# myproject/settings.py
import environ
# 初始化环境变量
env = environ.Env()
environ.Env.read_env()
# 数据库配置
DATABASES = {
'default': env.db('DATABASE_URL', default='mysql://root:password@localhost:3306/dbname')
}
# 其他配置
DEBUG = env.bool('DEBUG', default=False)
SECRET_KEY = env('SECRET_KEY')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['localhost'])
设置环境变量
在不同的环境中设置相应的环境变量。你可以在 .env
文件中设置这些变量,或者在操作系统中直接设置。
.env
文件示例
在项目根目录下创建一个 .env
文件,并添加以下内容:
# 开发环境
DEBUG=True
SECRET_KEY=your_secret_key_for_development
ALLOWED_HOSTS=localhost,127.0.0.1
DATABASE_URL=mysql://root:password@localhost:3306/dev_db
# 测试环境
# DEBUG=False
# SECRET_KEY=your_secret_key_for_testing
# ALLOWED_HOSTS=localhost,127.0.0.1
# DATABASE_URL=mysql://root:password@localhost:3306/test_db
# 生产环境
# DEBUG=False
# SECRET_KEY=your_secret_key_for_production
# ALLOWED_HOSTS=yourdomain.com
# DATABASE_URL=mysql://root:[email protected]:3306/ostp
操作系统环境变量
你也可以在操作系统的环境变量中设置这些值。例如,在 Linux 或 macOS 上,你可以在终端中运行:
export DEBUG=True
export SECRET_KEY=your_secret_key_for_development
export ALLOWED_HOSTS=localhost,127.0.0.1
export DATABASE_URL=mysql://root:password@localhost:3306/dev_db
Windows批处理
在bat脚本中设置了
@echo off
chcp 65001
echo "设置数据库运行环境为开发环境"
set DEBUG=True
set SECRET_KEY=123456
set ALLOWED_HOSTS=localhost,127.0.0.1
set DATABASE_URL=mysql://root:123456@localhost:3306/test
2. 使用多个 settings
文件
另一种方法是为每个环境创建一个单独的 settings
文件。这种方式更加直观,但可能会导致更多的文件管理。
创建多个 settings
文件
在 myproject
目录下创建以下文件:
settings_base.py
:基础配置settings_dev.py
:开发环境配置settings_test.py
:测试环境配置settings_prod.py
:生产环境配置
settings_base.py
# myproject/settings_base.py
import os
# 基础配置
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = 'your_default_secret_key'
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 你的应用
'myapp',
]
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',
]
ROOT_URLCONF = 'myproject.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
WSGI_APPLICATION = 'myproject.wsgi.application'
# 静态文件配置
STATIC_URL = '/static/'
settings_dev.py
# myproject/settings_dev.py
from .settings_base import *
# 开发环境配置
DEBUG = True
SECRET_KEY = 'your_secret_key_for_development'
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dev_db',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}
}
settings_test.py
# myproject/settings_test.py
from .settings_base import *
# 测试环境配置
DEBUG = False
SECRET_KEY = 'your_secret_key_for_testing'
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_db',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}
}
settings_prod.py
# myproject/settings_prod.py
from .settings_base import *
# 生产环境配置
DEBUG = False
SECRET_KEY = 'your_secret_key_for_production'
ALLOWED_HOSTS = ['yourdomain.com']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ostp',
'USER': 'root',
'PASSWORD': 'ostp',
'HOST': '10.177.111.228',
'PORT': '3306',
}
}
配置 manage.py
和 wsgi.py
在 manage.py
和 wsgi.py
中指定使用哪个 settings
文件。
manage.py
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings_dev') # 根据需要切换环境
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings_prod') # 根据需要切换环境
application = get_wsgi_application()
总结
通过使用环境变量或多个 settings
文件,你可以在 Django 项目中轻松地配置多个环境的 MySQL 数据库。选择哪种方法取决于你的具体需求和团队的工作流程。使用环境变量可以提供更好的灵活性和安全性,而使用多个 settings
文件则更加直观和易于管理。