Zwykle używam SQLite podczas tworzenia Django , ale na serwerze rzeczywistym często potrzebne jest coś solidniejszego ( MySQL / na przykład PostgreSQL ). Niezmiennie są też inne zmiany, które należy wprowadzić w ustawieniach Django: różne lokalizacje / intensywności rejestrowania, ścieżki mediów itp.
Jak zarządzasz wszystkimi tymi zmianami, aby wdrożenie było prostym, zautomatyzowanym procesem?
Odpowiedzi:
Aktualizacja: wydano django-configuration , co jest prawdopodobnie lepszą opcją dla większości ludzi niż robienie tego ręcznie.
Jeśli wolisz robić rzeczy ręcznie, moja wcześniejsza odpowiedź nadal obowiązuje:
Mam wiele plików ustawień.
settings_local.py
- konfiguracja specyficzna dla hosta, taka jak nazwa bazy danych, ścieżki plików itp.settings_development.py
- konfiguracja używana do rozwoju, npDEBUG = True
.settings_production.py
- konfiguracja używana do produkcji, npSERVER_EMAIL
.Wiążę to wszystko razem z
settings.py
plikiem, który najpierw importujesettings_local.py
, a następnie jednym z dwóch pozostałych. Decyduje, które załadować za pomocą dwóch ustawień w środkusettings_local.py
-DEVELOPMENT_HOSTS
iPRODUCTION_HOSTS
.settings.py
wezwaniaplatform.node()
aby znaleźć nazwę hosta maszyny, na której działa, a następnie szuka tej nazwy hosta na listach i ładuje drugi plik ustawień w zależności od listy, na której znajduje nazwę hosta.W ten sposób jedyną rzeczą, o którą naprawdę musisz się martwić, jest aktualizowanie
settings_local.py
pliku z konfiguracją specyficzną dla hosta, a wszystko inne jest obsługiwane automatycznie.Zobacz przykład tutaj .
źródło
_local
raczej mylący) oraz fakt, że nie używasz modułów (ustawienia /base.py, settings / local.py, settings / production.py). Byłoby również rozsądne, aby przechowywać to w oddzielnym repozytorium ... jeszcze lepiej, bezpiecznej usłudze, która obsługuje te informacje z kanonicznego źródła (prawdopodobnie dla większości przesada) ... aby nowy host nie wymagał nowej wersji..py
pliku, a tym samym dawać każdemu hostowi dostęp do informacji o konfiguracji każdego innego hosta, możesz utworzyć szablon manage.py tak, aby używał odpowiednich ustawień plik w konfiguracjach wdrożenia.Osobiście używam pojedynczego pliku settings.py dla projektu, po prostu sprawdzam nazwę hosta, na którym się znajduje (moje maszyny deweloperskie mają nazwy hostów zaczynające się od „gabriel”, więc mam tylko to:
to w innych częściach mam takie rzeczy jak:
i tak dalej. Trochę mniej czytelny, ale działa dobrze i oszczędza konieczności żonglowania wieloma plikami ustawień.
źródło
Na końcu settings.py mam:
W ten sposób, jeśli chcę zmienić ustawienia domyślne, muszę po prostu umieścić settings_local.py tuż obok settings.py.
źródło
settings_local
Powoduje toImportError
, toexcept
będzie ją połknąć w milczeniu.No module named...
vscannot import name...
, ale jest krucha. Lub umieść import w settings_local.py w blokach try i zgłoś bardziej szczegółowy wyjątek:MisconfiguredSettings
lub coś w tym stylu.Mam dwa pliki.
settings_base.py
który zawiera ustawienia wspólne / domyślne i który jest sprawdzany w kontroli źródła. Każde wdrożenie ma oddzielnesettings.py
, które jest wykonywanefrom settings_base import *
na początku, a następnie w razie potrzeby zastępuje.źródło
settings_local.py
to zrobifrom settings import *
, może zastąpić wartości wsettings.py
. (settings_local.py
plik musi zostać zaimportowany na końcusettings.py
).Najbardziej uproszczony sposób, jaki znalazłem, to:
1) użyj domyślnego settings.py do lokalnego programowania i 2) utwórz plik production-settings.py zaczynając od:
A potem po prostu zastąp ustawienia, które różnią się w produkcji:
źródło
Nieco powiązane, jeśli chodzi o kwestię wdrażania samego Django z wieloma bazami danych, możesz rzucić okiem na Djangostack . Możesz pobrać całkowicie darmowy instalator, który pozwala zainstalować Apache, Python, Django itp. W ramach procesu instalacji umożliwiamy Ci wybór bazy danych, której chcesz używać (MySQL, SQLite, PostgreSQL). Używamy instalatorów w szerokim zakresie podczas wewnętrznej automatyzacji wdrożeń (mogą one działać w trybie nienadzorowanym).
źródło
Mam plik settings.py w katalogu zewnętrznym. W ten sposób nie zostanie wpisany do kontroli źródła ani nadpisany przez wdrożenie. Umieściłem to w pliku settings.py w moim projekcie Django, wraz z wszelkimi ustawieniami domyślnymi:
Uwaga: jest to bardzo niebezpieczne, jeśli nie możesz ufać local_settings.py.
źródło
Oprócz wielu plików ustawień wspomnianych przez Jima, staram się również umieszczać dwa ustawienia w moim pliku settings.py u góry
BASE_DIR
iBASE_URL
ustawić ścieżkę kodu i adres URL do podstawy witryny, wszystkie inne ustawienia są modyfikowane dołączać się do nich.BASE_DIR = "/home/sean/myapp/"
na przykładMEDIA_ROOT = "%smedia/" % BASEDIR
Więc przenosząc projekt muszę tylko edytować te ustawienia i nie przeszukiwać całego pliku.
Poleciłbym również przyjrzeć się fabric i Capistrano (narzędziu Ruby, ale może być używane do wdrażania aplikacji Django), które ułatwiają automatyzację zdalnego wdrażania.
źródło
Cóż, używam tej konfiguracji:
Na końcu settings.py:
A w locale_settings.py:
źródło
Tyle skomplikowanych odpowiedzi!
Każdy plik settings.py zawiera:
Używam tego katalogu, aby ustawić zmienną DEBUG w ten sposób (ponownie wstaw z Directoy, w którym znajduje się twój kod dev):
Następnie za każdym razem, gdy plik settings.py zostanie przeniesiony, DEBUG będzie miał wartość False i będzie to Twoje środowisko produkcyjne.
Za każdym razem, gdy potrzebujesz innych ustawień niż te w środowisku deweloperskim, po prostu użyj:
źródło
Myślę, że to zależy od rozmiaru witryny, czy musisz przyspieszyć korzystanie z SQLite. Z powodzeniem użyłem SQLite na kilku mniejszych aktywnych witrynach i działa świetnie.
źródło
Używam środowiska:
Uważam, że jest to znacznie lepsze podejście, ponieważ ostatecznie potrzebujesz specjalnych ustawień dla swojego środowiska testowego i możesz łatwo dodać je do tego warunku.
źródło
To jest starszy post, ale myślę, że jeśli dodam ten użyteczny,
library
to uprości sprawę.Użyj konfiguracji django
Szybki start
Następnie podklasuj dołączone konfiguracje.Klasa konfiguracji w pliku settings.py Twojego projektu lub innym module, którego używasz do przechowywania stałych ustawień, np .:
Ustaw
DJANGO_CONFIGURATION
zmienną środowiskową na nazwę właśnie utworzonej klasy, np. W~/.bashrc
:export DJANGO_CONFIGURATION=Dev
i
DJANGO_SETTINGS_MODULE
zmienną środowiskową do ścieżki importu modułu jak zwykle, np. w bash:export DJANGO_SETTINGS_MODULE=mysite.settings
Alternatywnie podaj
--configuration
opcję podczas używania poleceń zarządzania Django zgodnie z domyślną--settings
opcją wiersza poleceń Django , np .:python manage.py runserver --settings=mysite.settings --configuration=Dev
Aby umożliwić Django korzystanie z Twojej konfiguracji, musisz teraz zmodyfikować skrypt manage.py lub wsgi.py, aby używał wersji odpowiednich funkcji startowych django-configuration , np. Typowy manage.py używający konfiguracji django wyglądałby następująco:
Zauważ, że w linii 10 nie używamy zwykłego narzędzia,
django.core.management.execute_from_command_line
ale zamiast tegoconfigurations.management.execute_from_command_line
.To samo dotyczy twojego pliku wsgi.py , np:
Tutaj nie używamy domyślnej
django.core.wsgi.get_wsgi_application
funkcji, ale zamiast tegoconfigurations.wsgi.get_wsgi_application
.Otóż to! Możesz teraz używać swojego projektu z manage.py i ulubionym serwerem obsługującym WSGI.
źródło
W rzeczywistości prawdopodobnie powinieneś rozważyć posiadanie takich samych (lub prawie takich samych) konfiguracji dla środowiska programistycznego i produkcyjnego. W przeciwnym razie od czasu do czasu będą się zdarzać sytuacje typu „Hej, to działa na moim komputerze”.
Aby więc zautomatyzować wdrażanie i wyeliminować problemy z WOMM, po prostu użyj Dockera .
źródło