全栈开发

django 项目部署

1、开发、测试、生产环境配置

pip install python-dotenv

新建配置文件:

开发
.env.dev
测试
.env.test
生产
.env.prod

基本格式

# 开发环境配置
DEBUG=True
SECRET_KEY=django-insecure-xxx
ALLOWED_HOSTS=localhost,127.0.0.1
DJANGO_VITE_DEV_MODE=true
# 生产环境配置
DEBUG=False
SECRET_KEY=django-insecure-xxx
ALLOWED_HOSTS=localhost,127.0.0.1
DJANGO_VITE_DEV_MODE=false

注意:参数获取的值都是字符串类型

2、settings.py改造:

import os
from pathlib import Path
from dotenv import load_dotenv

# 1. 加载环境变量文件
# 优先读取环境变量 ENV_FILE例如 "ENV_FILE=.env.prod"),否则默认 .env.dev
env_file = os.getenv('ENV_FILE', '.env.dev')
load_dotenv(env_file)

BASE_DIR = Path(__file__).resolve().parent.parent

# 读取 DJANGO_VITE_DEV_MODE默认为 True开发时方便
DJANGO_VITE_DEV_MODE = os.getenv('DJANGO_VITE_DEV_MODE', 'true') == 'true'

# 2. 从环境变量读取敏感配置
SECRET_KEY = os.getenv('SECRET_KEY', 'django-insecure-fallback-key')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', 'localhost,127.0.0.1').split(',')

# 3. 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.getenv('DB_NAME', 'bigdata_center'),
        'USER': os.getenv('DB_USER', 'bigdata_center'),
        'PASSWORD': os.getenv('DB_PASSWORD', ''),
        'HOST': os.getenv('DB_HOST', 'localhost'),
        'PORT': os.getenv('DB_PORT', '3306'),
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'charset': 'utf8mb4',
        }
    }
}

DJANGO_VITE = {
    'default': {
        'dev_mode': DJANGO_VITE_DEV_MODE,
    }
}

django-vite 及静态文件配置

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/6.0/howto/static-files/

STATIC_URL = 'static/'
# 这里制定vite编译路径 在执行 collectstatic 命令是会统一汇集到STATIC_ROOT指定路径
STATICFILES_DIRS = [
    BASE_DIR / 'assets',
]
STATIC_ROOT = BASE_DIR / 'staticfiles'

日志配置:

LOG_DIR = BASE_DIR / 'logs'
LOG_DIR.mkdir(exist_ok=True)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} | {levelname:8} | {pathname}:{lineno} | {threadName} | {message}',
            'style': '{',
            'datefmt': '%Y-%m-%d %H:%M:%S',
        },
        'simple': {
            'format': '[{levelname:.1s}] {asctime} {filename}:{lineno} - {message}',
            'style': '{',
            'datefmt': '%H:%M:%S',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'simple',
        },
        'file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': str(LOG_DIR / 'application.log'),
            'maxBytes': 10 * 1024 * 1024,
            'backupCount': 5,
            'encoding': 'utf-8',
            'level': 'DEBUG',
            'formatter': 'verbose',
        },
    },
    'root': {
        'handlers': ['console', 'file'],
        'level': 'DEBUG',
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            'propagate': False,
        },
        'datasource': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
            'propagate': False,
        },
        # 其他自定义 app
    },
}

3、使用静态资源服务(不使用nginx)

pip install whitenoise

配置中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', 
    ...
]

# 可选开启压缩和缓存提升性能
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

确保静态文件已收集

python manage.py collectstatic --no-input

以上配置后启动django即可拥有静态资源访问服务

4、服务部署

安装gunicorn

pip install gunicorn

启动命令

# 使用 gunicorn推荐 runserver
export ENV_FILE=.env.prod
gunicorn bigdata_center.wsgi:application --workers 2 --bind 0.0.0.0:8000