it-swarm-eu.dev

Jak konfigurujete Django pro jednoduchý vývoj a nasazení?

Mám tendenci používat SQLite , když dělám Django Vývoj, ale na živém serveru je často potřeba něco silnějšího (.____.) ( MySQL / PostgreSQL . Rovněž existují i ​​další změny nastavení Django : různá místa/intenzity záznamu, cesty médií atd.

Jak spravujete všechny tyto změny, aby bylo nasazení jednoduché, automatizované?

109
reppimp

Update:Django-konfigurace byl propuštěn, což je pravděpodobně lepší volba pro většinu lidí, než dělat ručně.

Pokud byste chtěli dělat věci ručně, moje dřívější odpověď stále platí:

Mám více souborů nastavení.

  • settings_local.py - Konfigurace specifická pro hostitele, například název databáze, cesty k souborům atd.
  • settings_development.py - konfigurace použitá pro vývoj, např. DEBUG = True.
  • settings_production.py - konfigurace používaná pro výrobu, např. SERVER_EMAIL.

Všechny tyto dohromady spojuji se souborem settings.py, který nejprve importuje settings_local.py, a pak jeden z dalších dvou. Rozhoduje, které zatížení má být provedeno dvěma nastaveními v settings_local.py - DEVELOPMENT_HOSTS a PRODUCTION_HOSTS. settings.py volá platform.node() najít jméno počítače, na kterém je spuštěn, a pak vyhledá název hostitele v seznamech a načte druhý soubor nastavení v závislosti na tom, v jakém seznamu nalezne hostname.

Jediné, čeho se opravdu musíte obávat, je udržovat soubor settings_local.py aktuální s konfigurací specifickou pro hostitele a vše ostatní je zpracováváno automaticky.

Podívejte se na příklad zde .

84
Jim

Osobně používám jediné nastavení.py pro projekt, jen jsem si to vyhledat jméno hostitele je to (moje vývojové stroje mají názvy hostitelů, které začínají na "gabriel", takže mám jen toto:

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

pak v jiných částech mám věci jako:

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/'

a tak dále. Trochu méně čitelné, ale funguje to dobře a šetří se tím, že je třeba žonglovat s několika soubory nastavení.

25
Gabriel Ross

Na konci settings.py mám následující:

try:
    from settings_local import *
except ImportError:
    pass

Tímto způsobem, pokud chci přepsat výchozí nastavení, musím právě nastavit settings_local.py hned vedle settings.py.

22

Mám dva soubory. settings_base.py, které obsahuje běžné/výchozí nastavení a které je kontrolováno do řízení zdroje. Každé nasazení má samostatné settings.py, které provádí from settings_base import * na začátku a podle potřeby přepíše.

11
John Millikin

Nejjednodušší způsob, jak jsem zjistil, byl:

1) použijte výchozí settings.py pro místní vývoj a 2) Vytvořit production-settings.py začínající na:

import os
from settings import *

A pak jen přepíšete nastavení, která se liší ve výrobě:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
7
Andre Bossard

Poněkud související, pro problematiku nasazení samotného Djanga s více databázemi, můžete se podívat na Djangostack . Můžete si stáhnout zcela zdarma instalační program, který vám umožní instalovat Apache, Python, Django, atd. V rámci instalačního procesu vám umožní vybrat, kterou databázi chcete použít (MySQL, SQLite, PostgreSQL). Instalační program používáme rozsáhle při automatizaci nasazení interně (mohou být spuštěny v bezobslužném režimu).

2
Josue

Mám soubor settings.py v externím adresáři. Tímto způsobem se nedostane kontrolováno do řízení zdrojů nebo přepsáno nasazením. Vložil jsem to do souboru settings.py v rámci projektu Django spolu s výchozím nastavením:

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")

Poznámka: To je velmi nebezpečné, pokud nemůžete důvěřovat local_settings.py.  

1
Chase Seibert

Používám tuto konfiguraci:

Na konci settings.py:

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

A v 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
sacabuche

Kromě více nastavení souborů uvedených Jim, jsem také tendenci umístit dvě nastavení do souboru settings.py v horní BASE_DIR a BASE_URL nastavit na cestu kódu a URL na základnu webu, všechny ostatní nastavení jsou upraveny tak, aby se k nim připojily.

BASE_DIR = "/home/sean/myapp/" např. MEDIA_ROOT = "%smedia/" % BASEDIR

Takže při přesunu projektu musím pouze upravit tato nastavení a nehledat celý soubor.

Také bych doporučil podívat se na látku a Capistrano (Ruby nástroj, ale může být použit k nasazení aplikací Django), které usnadňují automatizaci vzdáleného nasazení.

1
Sean O Donnell

Jedná se o starší příspěvek, ale myslím, že pokud přidám toto užitečné library, zjednoduší se to.

Použít Django-konfigurace

Rychlý start

pip install Django-configurations

Potom podtřídy zahrnuté konfigurace. Třída konfigurace v nastavení projektu .py nebo jakýkoli jiný modul, který používáte k uložení konstant nastavení, např .:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Nastavte proměnnou prostředí Django_CONFIGURATION na název třídy, kterou jste právě vytvořili, např. v ~/.bashrc:

export Django_CONFIGURATION=Dev

a proměnná prostředí Django_SETTINGS_MODULE na cestu importu modulu jako obvykle, např. v bash:

export Django_SETTINGS_MODULE=mysite.settings

Alternativně dodávat volbu --configuration při použití příkazů pro správu Django ve smyslu výchozí volby příkazového řádku --settings Django, např .:

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

Chcete-li, aby Django používal vaši konfiguraci, musíte nyní upravit svůj skript manage.py nebo wsgi.py pro použití verzí odpovídajících funkcí spouštěče Django, např. typická manage.py pomocí konfigurací Django bude vypadat takto:

#!/usr/bin/env python

import os
import sys

if __== "__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)

Všimněte si v řádku 10 nepoužíváme společný nástroj Django.core.management.execute_from_command_line, ale místo toho configurations.management.execute_from_command_line.

Totéž platí pro váš soubor wsgi.py, např .:

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()

Zde nepoužíváme výchozí funkci Django.core.wsgi.get_wsgi_application, ale místo toho configurations.wsgi.get_wsgi_application.

A je to! Nyní můžete použít svůj projekt s manage.py a vaším oblíbeným serverem podporujícím službu WSGI.

0
Little Phild

Myslím, že záleží na velikosti stránky, zda je třeba vstoupit z používání SQLite, jsem úspěšně používal SQLite na několika menších živých stránek a běží skvěle.

0
Ycros

Používám prostředí:

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

Věřím, že je to mnohem lepší přístup, protože nakonec potřebujete speciální nastavení pro testovací prostředí a můžete jej snadno přidat do tohoto stavu.

0
slashmili

Tolik složitých odpovědí!

Každý soubor settings.py je dodáván s:

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

Použil jsem tento adresář k nastavení proměnné DEBUG, jako je tento (reaplace s režisérem, kde je váš kód dev):

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

Pokaždé, když se soubor settings.py přesune, DEBUG bude False a je to vaše výrobní prostředí.

Pokaždé, když potřebujete jiné nastavení, než ve vašem prostředí dev, použijte:

if(DEBUG):
    #Debug setting
else:
    #Release setting
0
JM Desrosiers