управление локальными настройками django и сайта с несколькими разработчиками?

#django #settings #dev-to-production

#django #Настройки #переход от разработки к производству

Вопрос:

Осмотревшись, я придумал следующий код, который, похоже, работает хорошо, мне было интересно, что придумали другие, и обратная связь была бы отличной.

настройки/init.py

 import sys
import socket

# try to import settings file based on machine name.
try:
    settings = sys.modules[__name__]
    host_settings_module_name = '%s' % (socket.gethostname().replace('.', '_'))
    host_settings = __import__(host_settings_module_name, globals(), locals(), ['*'], -1)
    # Merge imported settings over django settings
    for key in host_settings.__dict__.keys():
        if key.startswith('_'): continue #skip privates and __internals__
        settings.__dict__[key] = host_settings.__dict__[key]

except Exception, e:
    print e
    from settings.site import *
  

settings/base.py

 BASE = 1
SITE = 1
LOCAL = 1
  

settings/site.py // специфичный для проекта

 from settings.base import *
SITE = 2
LOCAL = 2
  

settings/machine_name_local.py // настройки для конкретной машины для разработчиков или хост-сервера

 from settings.site import *
LOCAL = 3
  

Ответ №1:

Я думаю, что, хотя ваш код, вероятно, работает, он излишне сложен. Сложный код редко бывает полезен, потому что его трудно отлаживать, а ваш модуль настроек — последнее место, где вы хотите вносить ошибки в свой проект Django.

Проще иметь settings.py файл со всеми настройками для производственного сервера плюс настройки, общие для всех компьютеров разработки, и иметь local_settings.py импортированный внизу. local_settings.py Тогда разработчики добавят настройки, характерные для их машин.

settings.py:

 # all settings for the production server, 
# and settings common to all development machines eg. 
# INSTALLED_APPS, TEMPLATE_DIRS, MIDDLEWARE_CLASSES etc.

# Import local_settings at the very bottom of the file
# Use try|except block since we won't have this on the production server, 
# only on dev machines
try:
    from local_settings import *
except ImportError:
    pass
  

local_settings.py

 # settings specific to the dev machine
# eg DATABASES, MEDIA_ROOT, etc
# You can completely override settings in settings.py 
# or even modify them eg:

from settings import INSTALLED_APPS, MIDDLEWARE_CLASSES # Due to how python imports work, this won't cause a circular import error

INSTALLED_APPS  = ("debug_toolbar",)
MIDDLEWARE_CLASSES  = ('debug_toolbar.middleware.DebugToolbarMiddleware',)
  

Просто помните, что не следует загружать local_settings.py на рабочий сервер, а если вы используете VCS, настроить его таким образом, чтобы local_settings.py файл игнорировался.