Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ведь в этом случае глобальные настройки будут перекрыватьглобальныелокальные
DATABASE_ENGINE = ''не лучше ли написать что-то вроде
DATABASE_NAME = ''
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
import env(здесь evn — импортированный вначале файл с конфигурацией окружения). В такой форме сразу видно, что даная опция вовсе не оставлена пустой, а задана локально.
DATABASE_ENGINE = 'django.db.backends.postgresql_psycopg2'
DATABASE_NAME = env.DATABASE_NAME
DATABASE_USER = env.DATABASE_USER
DATABASE_PASSWORD = env.DATABASE_PASSWORD
DATABASE_HOST = env.DATABASE_HOST
DATABASE_PORT = env.DATABASE_PORT
А зачем вы одни и те же настройки пишите и как локальные, и как глобальные? Для того, чтобы локально можно было переопределить любую глобальную настройку?
DEBUG=False
TEMPLATE_LOADERS = (
('django.template.loaders.cached.Loader',
(
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
),
)
# ...etc
DEBUG=True
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)В локальных настройках продакшн-сервера я эти атрибуты не переопределяю. не лучше ли написать что-то вроде...
1. По основному конфигу не очевидно, что используется как есть, что будет обязательно переопределено, а что может быть переопределено.У нас действует соглашение, по которому глобальный конфиг является полностью рабочим. Единственное исключение — атрибут DATABASES, который обязательно всё-таки указать вручную.
settings_local.py.template, в котором указан шаблон обязательного атрибута DATABASES. В том же файле содержатся дополнительные атрибуты, которые желательно (но не обязательно) изменить для лучшего функционирования рабочей копии.2. В основном конфиге нет возможность делать зависимости от настроек, заданных в локальном конфиге.Это не проблема, а умышленное поведение. Я почему всюду этот settings и обзываю глобальным: он ни разу не должен зависеть от окружения и везде одинаков. И я, если честно, не могу придумать адекватного случая, когда такая зависимость нужна.
3. Зная лишь глобальный конфиг нет возможности определить, как сформировать локальный конфиг. Да и вообще определить, что там может находиться.Чем-то этот пункт напоминает п.1. Поэтому ответ тот же: настройки, которые желательно изменить, перечисляются в
local_settings.py.template, на основе которого уже и лепится local_settings.TEMPLATE_DIRS = ()
for root, dirs, files in os.walk(PROJECT_PATH)
if 'templates' in dirs: TEMPLATE_DIRS += (os.path.join(root, 'templates'),)TEMPLATE_DIRS = (
os.path.abspath(PROJECT_DIR),
os.path.abspath(PROJECT_DIR) + '/templates', # тут общие шаблоны -- base, 404, 500...
)
return render_to_response('geo/templates/index.html', content, RequestContext(request))return render_to_response('geo/templates/index.html', content, RequestContext(request))Посмотрите django-annoying. Авось пригодится.
или в PROJECT_ROOT/geo/templates/Это не понял. У меня же так и есть? Или предлагается создать внутри "/geo/templates/" еще папку geo только для того, чтобы сократить путь с 'geo/templates/index.html' до 'geo/index.html'? А IDE как поймет, где эти шаблоны искать?
TEMPLATE_LOADERS = (
#...
'django.template.loaders.app_directories.load_template_source',
)for root, dirs, files in os.walk(PROJECT_PATH)
if 'templates' in dirs: TEMPLATE_DIRS += (os.path.join(root, 'templates'),)
# Set DEBUG = True if on the production server
DEBUG = socket.gethostname() == PRODUCTION_SERVER
try:
from local_settings import *
except ImportError:
passif os.path.isfile(os.path.join(PROJECT_PATH, "local_settings.py")):
from local_settings import *
try:
from local_settings import *
except Exception, e:
import os, warnings
warnings.warn("Unable import local settings [%s]: %s" % (type(e), e))
sys.exit(1)
import os
def rel(*x):
return os.path.join(os.path.abspath(os.path.dirname(__file__)), *x)
#указываем путь так:
MEDIA_ROOT = rel('media')
from settings_default import * DATABASES['default']['NAME'] = os.path.abspath(os.path.join(PROJECT_PATH, '../database.db'))
Красивые конфиги Django