21 September 2010

Красивые конфиги Django

Django
Translation
Original author: Damon Jablons
За то время, пока я занимаюсь внедрением проектов, написанных на Django, накопились простые приемы упрощающие деплой. Разберем settings.py, который был использован в одном из последних проектов. Полностью файл доступен на http://gist.github.com/214361
Начнем.

Локальные настройки:

Локальные настройки позволяют иметь разные конфигурации одного проекта на разных машинах. В конце каждого моего файла 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

Применяю приемы на своем опыте — помогает. Приятного деплоя!
Tags:djangosettingsconfig
Hubs: Django
+40
16.6k 129
Comments 38