За то время, пока я занимаюсь внедрением проектов, написанных на Django, накопились простые приемы упрощающие деплой. Разберем settings.py, который был использован в одном из последних проектов. Полностью файл доступен на http://gist.github.com/214361
Начнем.
Локальные настройки позволяют иметь разные конфигурации одного проекта на разных машинах. В конце каждого моего файла settings.py есть подключение local_settings.py. Это позволяет переопределить любые значения переменных из settings.py. Например, на продакшн сервере я использую mysql, а на локальной машине — sqllite.
Вместо ручного изменения DEBUG=True/False, определяем сервер на котором запущена Django и меняем флаг автоматом. Если сайтов несколько ( тест сервер, QA сервер) — просто добавляем домены в проверку.
Первая строчка создаст переменную, хранящую путь до файла settings.py, который я храню в корне каталога проекта, там же расположена папка media. Таким образом можно автоматически построить полный путь до media, не зависимо от того где развернут проект. PROJECT_PATH удобно использовать и для настроек сторонних приложений.
Возможно, я немного дотошный, но я люблю когда в проект включено только то, что реально используется. Поэтому отбросим лишнее используя флаги.
Я храню папку с шаблонами(templates) в корень приложения, поэтому можно использовать простой обход для получения полных путей до шаблонов.
Я всегда оставляю настройки базы пустыми, это заставляет включать их в локальные настройки «local_settings.py». Я использую sqllite для разработки и mysql(или postgresql) для продакшена, но благодаря тому, что настройки хранятся в local_settings.py можно спокойно коммитить и апдейтить settings.py
Применяю приемы на своем опыте — помогает. Приятного деплоя!
Начнем.
Локальные настройки:
Локальные настройки позволяют иметь разные конфигурации одного проекта на разных машинах. В конце каждого моего файла settings.py есть подключение local_settings.py. Это позволяет переопределить любые значения переменных из settings.py. Например, на продакшн сервере я использую mysql, а на локальной машине — sqllite.
try:
from local_settings import *
except ImportError:
pass
Флаг отладки:
Вместо ручного изменения DEBUG=True/False, определяем сервер на котором запущена Django и меняем флаг автоматом. Если сайтов несколько ( тест сервер, QA сервер) — просто добавляем домены в проверку.
if socket.gethostname() == 'your.domain.com':
DEBUG = False
else:
DEBUG = True
Путь до медиа файлов:
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
Первая строчка создаст переменную, хранящую путь до файла settings.py, который я храню в корне каталога проекта, там же расположена папка media. Таким образом можно автоматически построить полный путь до media, не зависимо от того где развернут проект. PROJECT_PATH удобно использовать и для настроек сторонних приложений.
Используем только то, что нужно:
if DEBUG:
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.debug',)
if USE_I18N:
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.i18n',)
if DEBUG:
MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
Возможно, я немного дотошный, но я люблю когда в проект включено только то, что реально используется. Поэтому отбросим лишнее используя флаги.
Пути до шаблонов:
# Dir Structure
# + Application
# + templates
# + Application
# - someTemplate.html
# - models.py
# - views.py
# - otherAppSpecificFiles.py
# + OtherApplication
# + Templates
# - base.html
# - settings.py
# - urls.py
# - otherfiles.py
TEMPLATE_DIRS = ()
for root, dirs, files in os.walk(PROJECT_PATH)
if 'templates' in dirs: TEMPLATE_DIRS += (os.path.join(root, 'templates'),)
Я храню папку с шаблонами(templates) в корень приложения, поэтому можно использовать простой обход для получения полных путей до шаблонов.
Настройки подключения к базе:
# The database settings are left blank so to force the use of local_settings.py below
DATABASE_ENGINE = ''
DATABASE_NAME = ''
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
Я всегда оставляю настройки базы пустыми, это заставляет включать их в локальные настройки «local_settings.py». Я использую sqllite для разработки и mysql(или postgresql) для продакшена, но благодаря тому, что настройки хранятся в local_settings.py можно спокойно коммитить и апдейтить settings.py
Применяю приемы на своем опыте — помогает. Приятного деплоя!