一、生产环境配置
开发环境中DEBUG=True,Django 会显示详细的错误信息和调试页面。生产环境中必须关闭DEBUG,并正确配置安全选项。
python
# 文件路径:blog_project/settings.py import os # 安全密钥从环境变量读取(不要硬编码在代码中) SECRET_KEY = os.environ.get('SECRET_KEY', '开发环境默认密钥') # DEBUG 通过环境变量控制 DEBUG = os.environ.get('DEBUG', 'True').lower() == 'true' # 允许访问的主机名 ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',') # 静态文件收集目录 STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/'
配置项解析:
| 配置项 | 开发环境 | 生产环境 |
|---|---|---|
SECRET_KEY | 可硬编码 | 从环境变量读取 |
DEBUG | True | False |
ALLOWED_HOSTS | []或['localhost'] | 必须配置域名 |
STATIC_ROOT | 不需要 | 必须配置 |
重要提醒:
SECRET_KEY是 Django 最重要的安全密钥,用于加密 session、CSRF token 等。绝对不能硬编码在代码中或提交到 Git。生产环境中通过环境变量注入。
代码解析:
os.environ.get('DEBUG', 'True').lower() == 'true':从环境变量读取DEBUG,默认True。字符串'True'转小写后与'true'比较,得到布尔值。.split(','):将逗号分隔的字符串转为列表,方便配置多个域名。
二、依赖管理与 requirements.txt
生成依赖列表,部署平台用它来安装项目所需的包。
bash
(venv) $ pip freeze > requirements.txt
检查文件内容,确保包含以下关键依赖:
text
Django>=5.0,<6.0 gunicorn>=21.0 # 生产级 WSGI 服务器 whitenoise>=6.0 # 静态文件服务(可选)
如果没有 gunicorn,先安装:
bash
(venv) $ pip install gunicorn (venv) $ pip freeze > requirements.txt
各依赖的作用:
| 包名 | 作用 |
|---|---|
Django | Web 框架本体 |
gunicorn | 生产级 WSGI 服务器,替代runserver |
whitenoise | 让 Gunicorn 直接提供静态文件服务 |
三、配置 Gunicorn + Whitenoise
Django 自带的runserver不适合生产环境。Gunicorn是 Python 生产级 WSGI 服务器,处理并发请求。Whitenoise让 Gunicorn 能直接提供静态文件服务(CSS、JS、图片)。
python
# 文件路径:blog_project/settings.py # Whitenoise 中间件必须放在 SecurityMiddleware 之后,其他中间件之前 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # 新增:静态文件中间件 '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', ]
Whitenoise 中间件的顺序要求:
text
SecurityMiddleware → WhiteNoiseMiddleware → 其他所有中间件
必须放在SecurityMiddleware之后、其他中间件之前,否则静态文件可能无法正常服务。
在项目根目录创建 Procfile:
text
web: gunicorn blog_project.wsgi --log-file -
Procfile 解析:
| 部分 | 含义 |
|---|---|
web: | 声明这是一个 Web 服务进程 |
gunicorn | 使用 Gunicorn 启动 |
blog_project.wsgi | WSGI 入口模块路径 |
--log-file - | 日志输出到标准输出(平台可捕获) |
四、收集静态文件
生产环境下,Django 不自动提供静态文件服务,需要用collectstatic收集到统一目录。
bash
(venv) $ python manage.py collectstatic
这个命令会把 Admin 后台的静态文件、blog 应用的静态文件都复制到STATIC_ROOT目录(staticfiles/)。
开发环境 vs 生产环境:
| 环境 | 静态文件处理 |
|---|---|
| 开发环境 | 一般不需要运行collectstatic,Django 自动查找各 App 的static目录 |
| 生产环境 | 部署前必须运行,确保所有静态文件集中到一个目录 |
五、将项目推送到 GitHub
1. 创建 .gitignore
确保敏感文件和临时文件不被提交:
text
venv/ __pycache__/ *.pyc db.sqlite3 staticfiles/ .env
各条目说明:
| 条目 | 原因 |
|---|---|
venv/ | 虚拟环境,体积大且可重建 |
__pycache__/ | Python 字节码缓存 |
*.pyc | 编译后的 Python 文件 |
db.sqlite3 | 开发数据库,不应提交 |
staticfiles/ | 收集的静态文件,部署时重新生成 |
.env | 环境变量文件,含敏感信息 |
2. 推送到 GitHub
bash
$ git init $ git add . $ git commit -m "初始化 Django 博客项目" $ git branch -M main $ git remote add origin https://github.com/你的用户名/django-blog.git $ git push -u origin main
六、Railway 部署
Railway 是新兴的云部署平台,对 Django 这类全栈应用支持良好。
部署步骤
访问 railway.app,用 GitHub 账号登录。
点击"New Project"→"Deploy from GitHub repo"→ 选择
django-blog仓库。Railway 会自动检测
Procfile,识别启动命令。在Variables中设置环境变量。
点击Deploy,等待构建和部署完成。
环境变量配置
| 变量名 | 值 | 说明 |
|---|---|---|
SECRET_KEY | 随机生成的长字符串 | Django 安全密钥 |
DEBUG | False | 关闭调试模式 |
ALLOWED_HOSTS | .railway.app | 允许 Railway 域名访问 |
快速生成 SECRET_KEY:
bash
$ python -c "import secrets; print(secrets.token_urlsafe(50))"
部署成功后,获得链接如:https://django-blog.up.railway.app
温馨提示:Railway 免费额度有限(每月 $5 或 500 小时)。如果只是测试学习,用完记得暂停项目。Heroku 已取消免费计划,所以本教程推荐 Railway 作为替代。
七、部署流程图
八、常见部署问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 部署后 500 错误 | DEBUG=False且未配ALLOWED_HOSTS | 设置ALLOWED_HOSTS=.railway.app |
| 静态文件 404 | 未运行collectstatic或未配 Whitenoise | 检查中间件顺序,确认已收集 |
DisallowedHost | 域名不在ALLOWED_HOSTS | 添加 Railway 域名 |
| 应用启动失败 | Procfile 路径错误 | 确认blog_project.wsgi与实际项目名一致 |
SECRET_KEY报错 | 环境变量未设置 | 在 Railway Variables 中添加 |
| 数据库报错 | 未执行迁移 | 在部署命令中加入migrate |
| 构建超时 | 依赖过多 | 精简requirements.txt |
在 Procfile 中加入迁移命令:
text
web: python manage.py migrate --noinput && gunicorn blog_project.wsgi --log-file -
说明:
--noinput表示不提示确认,适合自动化部署。
九、下一步学习方向
| 学习方向 | 适合谁 | 推荐起点 |
|---|---|---|
| Django REST Framework (DRF) | 需要为前端框架(Vue3/React)构建 API 后端 | 学习 Serializer + ViewSet,将博客改造为 API 服务 |
| PostgreSQL | 需要生产级数据库 | 替换 SQLite,使用django-environ管理数据库配置 |
| Celery 异步任务 | 需要后台任务(发邮件、生成报表) | 接入 Redis + Celery,实现异步任务队列 |
| Django + Vue3/React 前后端分离 | 想要前后端分离架构 | 用 DRF 构建 API 后端,Vue3/React 构建前端,通过 fetch 通信 |
十、小结
本章你完成了博客项目的最后一步:
生产环境配置:
SECRET_KEY、DEBUG、ALLOWED_HOSTS通过环境变量管理。依赖管理:
pip freeze > requirements.txt生成依赖清单。生产服务器:Gunicorn + Whitenoise 替代
runserver。Procfile:定义启动命令,让平台识别如何运行应用。
静态文件:
collectstatic收集到统一目录。GitHub 推送:
.gitignore排除敏感文件。Railway 部署:关联仓库、配置环境变量、一键上线。
至此,你的 Django 博客已经从零到一,完整上线。整个系列走完了从环境搭建、模型设计、视图模板、用户系统到生产部署的全流程。接下来,你可以基于这个项目继续扩展评论、标签、RSS 订阅等功能,或转向 DRF 构建 API 服务。