Как настроить Django для простой разработки и развертывания? - PullRequest
111 голосов
/ 18 сентября 2008

Я склонен использовать SQLite при выполнении Джанго разработки, но на живом сервере что-то более надежное часто требуется (например, MySQL / PostgreSQL ). Неизменно, есть и другие изменения, которые нужно внести в Джанго настройки, а также: различные места регистрации / интенсивность, медиа пути и т. д.

Как вы управляете всеми этими изменениями, чтобы сделать развертывание простой, автоматизированный процесс?

Ответы [ 14 ]

85 голосов
/ 18 сентября 2008

Обновление: django-configurations выпущен, что, вероятно, является лучшим вариантом для большинства людей, чем делать это вручную.

Если вы предпочитаете делать что-то вручную, мой прежний ответ по-прежнему применяется:

У меня есть несколько файлов настроек.

  • settings_local.py - специфичная для хоста конфигурация, такая как имя базы данных, пути к файлам и т. Д.
  • settings_development.py - конфигурация, используемая для разработки, например, DEBUG = True.
  • settings_production.py - конфигурация, используемая для производства, например, SERVER_EMAIL.

Я связываю их все вместе с файлом settings.py, который сначала импортирует settings_local.py, а затем один из двух других. Он решает, какой из двух параметров загрузить внутри settings_local.py - DEVELOPMENT_HOSTS и PRODUCTION_HOSTS. settings.py вызывает platform.node(), чтобы найти имя хоста машины, на которой он работает, а затем ищет это имя хоста в списках и загружает второй файл настроек в зависимости от того, в каком списке он находит имя хоста.

Таким образом, единственное, о чем вам действительно нужно беспокоиться, это поддерживать файл settings_local.py в актуальном состоянии с конфигурацией, специфичной для хоста, а все остальное обрабатывается автоматически.

Посмотрите пример здесь .

26 голосов
/ 18 сентября 2008

Лично я использую один файл settings.py для проекта, мне просто нужно найти имя хоста, на котором он находится (мои машины для разработки имеют имена хостов, начинающиеся с "gabriel", поэтому у меня просто так:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

тогда в других частях у меня есть такие вещи, как:

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

и так далее. Чуть менее читабелен, но работает нормально и избавляет от необходимости манипулировать несколькими файлами настроек.

23 голосов
/ 18 сентября 2008

В конце settings.py у меня есть следующее:

try:
    from settings_local import *
except ImportError:
    pass

Таким образом, если я хочу переопределить настройки по умолчанию, мне нужно просто поместить settings_local.py рядом с settings.py.

11 голосов
/ 18 сентября 2008

У меня есть два файла. settings_base.py, который содержит общие / стандартные настройки и который проверен в управлении исходным кодом. Каждое развертывание имеет отдельный settings.py, который вначале выполняет from settings_base import *, а затем при необходимости переопределяет.

7 голосов
/ 08 июля 2010

Самый простой способ, который я нашел, был:

1) использовать по умолчанию settings.py для локальной разработки и 2) создать production-settings.py , начиная с:

import os
from settings import *

А затем просто переопределите настройки, которые отличаются в производстве:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
2 голосов
/ 27 июля 2011

В некоторой степени связанный с вопросом развертывания самого Django с несколькими базами данных, вы можете взглянуть на Djangostack . Вы можете загрузить совершенно бесплатный установщик, который позволяет устанавливать Apache, Python, Django и т. Д. В рамках процесса установки мы позволяем вам выбрать, какую базу данных вы хотите использовать (MySQL, SQLite, PostgreSQL). Мы широко используем установщики при внутренней автоматизации развертываний (их можно запускать в автоматическом режиме).

1 голос
/ 13 августа 2011

Ну, я использую эту конфигурацию:

В конце settings.py:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

И в locale_settings.py:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
1 голос
/ 06 октября 2009

У меня есть файл settings.py во внешнем каталоге. Таким образом, он не проверяется в системе контроля версий и не перезаписывается при развертывании. Я поместил это в файл settings.py под моим проектом Django вместе со всеми настройками по умолчанию:

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

Примечание. Это очень опасно, если вы не можете доверять local_settings.py.

1 голос
/ 18 сентября 2008

В дополнение к нескольким файлам настроек, упомянутым Джимом, я также стараюсь поместить две настройки в мой файл settings.py вверху BASE_DIR и BASE_URL, указав путь к коду и URL-адрес базы сайта, все остальные настройки изменены, чтобы добавить себя к ним.

BASE_DIR = "/home/sean/myapp/" например MEDIA_ROOT = "%smedia/" % BASEDIR

Поэтому при перемещении проекта мне нужно только отредактировать эти настройки, а не искать весь файл.

Я бы также порекомендовал взглянуть на Fabric и Capistrano (инструмент Ruby, но его можно использовать для развертывания приложений Django), которые облегчают автоматизацию удаленного развертывания.

0 голосов
/ 11 мая 2018

Это старый пост, но я думаю, что если я добавлю это полезное library, это упростит вещи.

Использование django-конфигурации

Quickstart

pip install django-configurations

Затем создайте подкласс включенных конфигураций. Класс конфигурации в файле settings.py вашего проекта или в любом другом модуле, который вы используете для хранения констант настроек, например ::

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Задайте для переменной среды DJANGO_CONFIGURATION имя только что созданного класса, например, в ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

и переменная окружения DJANGO_SETTINGS_MODULE к пути импорта модуля, как обычно, например, в баш:

export DJANGO_SETTINGS_MODULE=mysite.settings

В качестве альтернативы укажите параметр --configuration при использовании команд управления Django в соответствии с параметром командной строки Django по умолчанию --settings, например ::1010 *

python manage.py runserver --settings=mysite.settings --configuration=Dev

Чтобы позволить Django использовать вашу конфигурацию, вам теперь нужно изменить скрипт manage.py или wsgi.py , чтобы использовать версии соответствующих стартовых функций django-конфигураций, например, типичный manage.py с использованием django-конфигураций будет выглядеть так:

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Обратите внимание, что в строке 10 мы не используем общий инструмент django.core.management.execute_from_command_line, а вместо этого configurations.management.execute_from_command_line.

То же самое относится к вашему wsgi.py файлу, например ::

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

Здесь мы не используем функцию django.core.wsgi.get_wsgi_application по умолчанию, а вместо configurations.wsgi.get_wsgi_application.

Вот и все! Теперь вы можете использовать свой проект с manage.py и вашим любимым сервером с поддержкой WSGI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...