Як налаштувати Django для простої розробки та розгортання?


112

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

Як ви керуєте всіма цими змінами, щоб зробити розгортання простим, автоматизованим процесом?


Я, очевидно, нічого не роблю, як ніхто інший :). Я просто скористаюся ORM, який постачає джанго.
— Андрій Сани

1
Питання полягало в тому, як автоматизувати зміну налаштувань для переключення між середовищами :-)
— Guruprasad


Ви можете подивитися на цей пакет: django-split-settings
— sobolevn

Відповіді:


86

Оновлення: було випущено конфігурації django, що, мабуть, кращий варіант для більшості людей, ніж це робити вручну.

Якщо ви хочете робити речі вручну, моя попередня відповідь все ще застосовується:

У мене є кілька файлів налаштувань.

  • 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файлу в курсі конфігурації хоста, а все інше обробляється автоматично.

Ознайомтеся з прикладом тут .


2
що робити, якщо постановка (розробка) та виробництво виконуються на одній машині? platform.node () повертає те ж саме.
— gwaramadze

2
Приклад посилання вниз.
— Jickson

Відмінна ідея визначити настройки на основі списків хостів! Мій один nitpick - це номенклатура (settings_local.py завжди імпортується спочатку, тому будь-які параметри, які не перекриваються, все ще будуть активними у виробництві, роблячи суфікс _localдосить заплутаним) і те, що ви не використовуєте модулі (налаштування /base.py, settings / local.py, settings / production.py). Було б також розумним зберігати це в окремому сховищі ... ще краще - безпечний сервіс, який обслуговує цю інформацію з канонічного джерела (можливо, надмірне вбивство для більшості) ... щоб новий хост не потребував нового випуску.
— DylanYoung

Ще краще, якщо ви використовуєте програмне забезпечення для управління машиною, замість того, щоб перевіряти список хостів у .pyфайлі і тим самим надавати кожному хосту доступ до інформації про конфігурацію кожного іншого хоста, ви можете шаблонувати файл management.py для використання відповідних налаштувань файл у конфігураціях розгортання.
— DylanYoung

26

Особисто я використовую одну програму 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/'

і так далі. Трохи менш читабельний, але він працює чудово і економить необхідність перевмикання декількох файлів налаштувань.


Мені подобається ця ідея, але вона не дозволить мені розрізняти різні екземпляри Django, що працюють на одному хості. Це станеться, наприклад, якби у вас були різні екземпляри для різних субдоменів на одному хості.
— Ерік

24

В кінці settings.py у мене є наступне:

try:
    from settings_local import *
except ImportError:
    pass

Таким чином, якщо я хочу змінити налаштування за замовчуванням, мені потрібно просто поставити settings_local.py праворуч від settings.py.


4
Це злегка небезпечно, тому що якщо помилка друку settings_localпризведе до того ImportError, що це exceptпроковтне це мовчки.
— Кріс Мартін

Ви можете перевірити повідомлення No module named...проти cannot import name..., але воно крихке. Або поставте імпорт у settings_local.py у випробувальних блоках та підберіть більш конкретний виняток: MisconfiguredSettingsабо щось для цього.
— DylanYoung

11

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


1
Я також цим користуюся. Він перевершує обернену (dmishe "з settings_local import *" в кінці settings.py), оскільки дозволяє локальним налаштуванням отримати доступ та змінити глобальні, якщо потрібно.
— Карл Мейєр

3
Якщо settings_local.pyце зробити from settings import *, це може змінити значення в settings.py. ( settings_local.pyфайл потрібно імпортувати наприкінці settings.py).
— Сет

Це можна зробити будь-коли. Погляньте на stackoverflow.com/a/7047633/3124256 вище. @Seth Це рецепт кругового імпорту.
— DylanYoung

7

Найбільш спрощений спосіб, який я знайшов:

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

import os
from settings import *

А потім просто перекрийте налаштування, які відрізняються виробництвом:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}

Як django знає, щоб завантажити налаштування виробництва?
— AlxVallejo

2

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


1
Як варіант я хотів би порекомендувати Django під ключ Linux на базі стека Ubuntu * NIX з попередньо встановленим django.
— jochem

1

У мене є файл 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

На додаток до декількох файлів налаштувань, згаданих Джимом, я також схильний розміщувати два налаштування у своєму файлі settings.py вгорі BASE_DIRі BASE_URLвстановлювати шлях коду та URL-адресу до основи сайту, всі інші налаштування змінюються приєднатися до них.

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

Тому під час переміщення проекту мені залишається лише редагувати ці налаштування, а не шукати весь файл.

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


Відповідь - python і пропонує набагато більш надійні засоби надання послуг, ніж Fabric. Вони також добре поєднуються.
— DylanYoung

1

Ну, я використовую цю конфігурацію:

В кінці 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

Стільки складних відповідей!

Кожен файл settings.py має:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

Я використовую цей каталог для встановлення такої змінної DEBUG (замініть дирекцію, де знаходиться ваш код розробника):

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

Потім, кожного разу, коли файл settings.py переміщуватиметься, DEBUG буде помилковим, і це ваше виробниче середовище.

Кожен раз, коли вам потрібні інші налаштування, ніж ті, що у вашому середовищі розробників, просто використовуйте:

if(DEBUG):
    #Debug setting
else:
    #Release setting

0

Я думаю, що від розміру сайту це залежить від того, чи потрібно вам відмовитися від використання SQLite, я успішно використовував SQLite на кількох менших веб-сайтах, і він працює чудово.


0

Я використовую середовище:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

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


0

Це старіший пост, але я думаю, якщо я додаю цю корисну, libraryце спростить речі.

Використовуйте конфігурацію джанго

Швидкий старт

pip install django-configurations

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

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Встановіть DJANGO_CONFIGURATIONзмінну оточення на ім'я щойно створеного класу, наприклад у ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

і DJANGO_SETTINGS_MODULEзмінна середовище на шлях імпорту модуля, як зазвичай, наприклад у bash:

export DJANGO_SETTINGS_MODULE=mysite.settings

Альтернативно надайте --configurationпараметр при використанні команд управління Django уздовж рядків --settingsпараметра командного рядка за замовчуванням , наприклад:

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

Щоб увімкнути Django для використання вашої конфігурації, вам тепер потрібно змінити ваш script.py або wsgi.py скрипт, щоб використовувати версії django-configurations відповідних функцій запуску, наприклад, типовий 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.

Це воно! Тепер ви можете використовувати свій проект за допомогою файлу Manag.py та улюбленого сервера з підтримкою WSGI.


-2

Насправді вам, мабуть, слід подумати про наявність однакових (або майже однакових) конфігурацій для вашого середовища розробки та виробництва. В іншому випадку періодично трапляються ситуації на кшталт "Ей, це працює на моїй машині".

Тож для автоматизації розгортання та усунення цих проблем WOMM просто використовуйте Docker .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.