☰
Django入门教程(二十九):博客项目实战(十)——打包上线部署到Railway
2026/9/25 19:36:05 网站建设 项目流程
一、生产环境配置

开发环境中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可硬编码从环境变量读取
DEBUGTrueFalse
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

各依赖的作用:

包名作用
DjangoWeb 框架本体
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.wsgiWSGI 入口模块路径
--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 这类全栈应用支持良好。

部署步骤
  1. 访问 railway.app,用 GitHub 账号登录。

  2. 点击"New Project"→"Deploy from GitHub repo"→ 选择django-blog仓库。

  3. Railway 会自动检测Procfile,识别启动命令。

  4. 在Variables中设置环境变量。

  5. 点击Deploy,等待构建和部署完成。

环境变量配置
变量名值说明
SECRET_KEY随机生成的长字符串Django 安全密钥
DEBUGFalse关闭调试模式
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 服务。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询