王锋

王锋的博客

他的个人主页  他的博客

将django项目部署到heroku上记

王锋  2026年06月24日 星期三 17:11 | 25次浏览 | 0条评论

注意database上的使用

Django + Heroku 连接 Heroku MySQL(ClearDB)settings.py 完整配置

Heroku 官方 MySQL 插件是 ClearDB MySQL,添加插件后会自动生成环境变量 CLEARDB_DATABASE_URL,核心思路:读取环境变量解析数据库连接参数,不硬编码账号密码。

一、前置准备

Heroku 安装 MySQL 插件

bash

运行

heroku addons:create cleardb:ignite

 

本地安装依赖

txt

# requirements.txt

django

pymysql

dj-database-url

gunicorn

 

二、settings.py 完整数据库配置

1. 顶部导入依赖

python

运行

import os

import dj_database_url

# 适配mysql驱动

import pymysql

pymysql.install_as_MySQLdb()

 

2. 数据库核心配置

python

运行

# 读取Heroku数据库环境变量

DATABASE_URL = os.environ.get('CLEARDB_DATABASE_URL')

 

if DATABASE_URL:

    # Heroku线上MySQL配置

    DATABASES = {

        'default': dj_database_url.config(

            default=DATABASE_URL,

            conn_max_age=600,  # 连接池超时

            engine='django.db.backends.mysql'

        )

    }

else:

    # 本地开发MySQL配置(本地调试用,线上不会执行)

    DATABASES = {

        'default': {

            'ENGINE': 'django.db.backends.mysql',

            'NAME': 'local_db',

            'USER': 'root',

            'PASSWORD': '本地密码',

            'HOST': '127.0.0.1',

            'PORT': '3306',

        }

    }

 

三、关键配套 settings 全局配置(Heroku 必须加)

1. 关闭调试、允许 Heroku 域名访问

python

运行

# 线上关闭DEBUG

DEBUG = os.environ.get('DEBUG', 'False') == 'True'

 

# 允许heroku分配的域名

ALLOWED_HOSTS = [os.environ.get('HEROKU_APP_NAME') + '.herokuapp.com']

# 兼容本地

if DEBUG:

    ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

 

2. 静态文件配置(Heroku 必备)

python

运行

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# 生产静态文件收集

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

 

3. 安全密钥(禁止硬编码)

python

运行

SECRET_KEY = os.environ.get('SECRET_KEY')

# 本地兜底

if not SECRET_KEY and DEBUG:

    SECRET_KEY = 'dev-secret-key-123'

 

四、补充说明:dj_database_url 自动解析规则

ClearDB 的 CLEARDB_DATABASE_URL 格式示例:

plaintext

mysql://user:password@host:port/dbname?reconnect=true

 

dj_database_url.config() 会自动拆分:

USER / PASSWORD / HOST / PORT / NAME

并指定 mysql 引擎,无需手动拆分参数。

五、备选方案:手动拆分 ClearDB 参数(不推荐,仅做理解)

如果不想用dj-database-url,手动解析 URL:

python

运行

import os

from urllib.parse import urlparse

 

db_url = urlparse(os.environ.get("CLEARDB_DATABASE_URL"))

DATABASES = {

    "default": {

        "ENGINE": "django.db.backends.mysql",

        "NAME": db_url.path[1:],

        "USER": db_url.username,

        "PASSWORD": db_url.password,

        "HOST": db_url.hostname,

        "PORT": db_url.port,

        "OPTIONS": {

            "charset": "utf8mb4"

        }

    }

}

 

六、常见坑与修复

pymysql 报错

必须执行 pymysql.install_as_MySQLdb() 放在文件最上方,否则 Django 不识别 mysql 驱动。

字符集乱码

增加数据库 OPTIONS,统一 utf8mb4:

python

运行

DATABASES['default']['OPTIONS'] = {

    'charset': 'utf8mb4',

    'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"

}

 

migrate 迁移数据库

部署完成后执行 Heroku 迁移:

bash

运行

heroku run python manage.py migrate

 

环境变量缺失报错

登录 Heroku 后台 App → Settings → Config Vars,确认存在 CLEARDB_DATABASE_URL。

七、Procfile(同目录新建,不可少)

plaintext

web: gunicorn 你的项目名.wsgi --log-file -


评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !

暂时没有评论

Zeuux © 2026

京ICP备05028076号