Я полагаю, что самая большая проблема между средами разработки и производства - это разница в базах данных, которые они используют. Поэтому используйте переменные среды для режимов разработки и производства.
- Создайте файл .env в проекте root
SECRET_KEY='somesupersecretivesecretkey'
DEBUG=True #set to false while pushing to Heroku, leave at True while working in development
DB_NAME='dbname'
DB_USER='dbuser'
DB_PASSWORD='dbpassword'
DB_HOST='127.0.0.1'
MODE='dev' #set to 'prod' in production
ALLOWED_HOSTS='.localhost', '.herokuapp.com', '.127.0.0.1'
DISABLE_COLLECTSTATIC=1
В настройках вашего проекта (вам нужен только один), проверьте, в каком режиме вы находитесь (производство или разработка) и выберите, какую базу данных использовать (ту, которая установлена в Heroku или ту, которая установлена на вашем компьютере). Предполагая, что вы используете Postgres, что-то вроде этого:
import os
import django_heroku
import dj_database_url
from decouple import config,Csv
MODE=config("MODE", default="dev")
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
# development
if config('MODE')=="dev":
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config('DB_NAME'),
'USER': config('DB_USER'),
'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST'),
'PORT': '',
}
}
# production
else:
DATABASES = {
'default': dj_database_url.config(
default=config('DATABASE_URL')
)
}
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
Перед отправкой кода в Heroku, после соответствующего изменения переменной
.env
, запустите
heroku config:set $(cat .env | sed '/^$/d; /#[[:print:]]*$/d')
, чтобы применить изменения базы данных на панели управления heroku ... Надеюсь, это поможет