Pracowałem nad podstawową aplikacją. Teraz na etapie wdrażania stało się jasne, że potrzebuję zarówno ustawień lokalnych, jak i ustawień produkcyjnych.
Byłoby wspaniale wiedzieć, co następuje:
- Jak najlepiej radzić sobie z ustawieniami rozwoju i produkcji.
- Jak zachować aplikacje, takie jak django-debug-toolbar, tylko w środowisku programistycznym.
- Wszelkie inne wskazówki i sprawdzone metody dotyczące ustawień programowania i wdrażania.
Odpowiedzi:
Te
DJANGO_SETTINGS_MODULE
zmienne środowisko kontrole który plik ustawień Django załaduje.Dlatego tworzysz osobne pliki konfiguracyjne dla swoich odpowiednich środowisk (pamiętaj, że mogą one oczywiście
import *
pochodzić z oddzielnego pliku „wspólnych ustawień”) i używaj ichDJANGO_SETTINGS_MODULE
do kontrolowania, którego z nich użyć.Oto jak:
Jak zauważono w dokumentacji Django:
Więc załóżmy, że utworzyłeś
myapp/production_settings.py
i jesteśmyapp/test_settings.py
w swoim repozytorium źródłowym.W takim przypadku należałoby odpowiednio ustawić
DJANGO_SETTINGS_MODULE=myapp.production_settings
używanie pierwszego iDJANGO_SETTINGS_MODULE=myapp.test_settings
drugiego.Odtąd problem sprowadza się do ustawienia
DJANGO_SETTINGS_MODULE
zmiennej środowiskowej.Ustawienie
DJANGO_SETTINGS_MODULE
za pomocą skryptu lub powłokiNastępnie można użyć skryptu bootstrap lub Process Manager, aby załadować poprawne ustawienia (poprzez ustawienie środowiska), lub po prostu go uruchomić z powłoki przed rozpoczęciem Django:
export DJANGO_SETTINGS_MODULE=myapp.production_settings
.Zauważ, że możesz uruchomić ten eksport w dowolnym momencie z powłoki - nie musi on mieszkać w twoim
.bashrc
ani nic.Ustawienie
DJANGO_SETTINGS_MODULE
za pomocą menedżera procesówJeśli nie lubisz pisać skryptu bootstrap, który ustawia środowisko (i są bardzo dobre powody, aby tak się czuć!), Polecam skorzystanie z menedżera procesów:
environment
..env
) .Na koniec zwróć uwagę, że możesz wykorzystać
PYTHONPATH
zmienną do przechowywania ustawień w zupełnie innej lokalizacji (np. Na serwerze produkcyjnym, przechowywanie ich na/etc/
). Pozwala to na oddzielenie konfiguracji od plików aplikacji. Możesz tego chcieć lub nie, zależy to od struktury Twojej aplikacji.źródło
settings.py
plik jest przechowywanySiteName/settings.py
domyślnie, jeśli umieścisz swoje alternatywne pliki ustawień w tym samym katalogu, wiersz dodany do bin /ivate powinien brzmiećDJANGO_SETTINGS_MODULE="SiteName.test_settings"
W przeciwnym razie doskonała odpowiedź!DJANGO_SETTINGS_MODULE
aby wybrać ten, którego chcesz użyć. Modyfikacjabin/activate
to jedna z tych drugich (TBH, i tak nie uważam już, że to dobry pomysł, więc usunąłem to), ale nie jest to jedyne.Domyślnie używaj ustawień produkcyjnych, ale utwórz plik o nazwie
settings_dev.py
w tym samym folderze cosettings.py
plik. Dodaj tam nadpisania, takie jakDEBUG=True
.Na komputerze, który będzie używany do programowania, dodaj to do pliku
~/.bashrc
pliku:Na dole twojego
settings.py
pliku dodaj następujące informacje.(Pamiętaj, że
*
w Pythonie należy unikać importowania )Domyślnie serwery produkcyjne niczego nie zastępują. Gotowe!
W porównaniu z innymi odpowiedziami, ta jest prostsza, ponieważ nie wymaga aktualizacji
PYTHONPATH
ani ustawień,DJANGO_SETTINGS_MODULE
które pozwalają na pracę tylko nad jednym projektem django na raz.źródło
if os.environ.get('DJANGO_DEVELOPMENT', 'true')
również działa. Wspominam o tym tylko dlatego, że powyższais not true
metoda nie została zaimportowana dla mnie w Pythonie 3.6.DEV
ustawień, które będą wyciekać prywatne dane na serwerze publicznym. Naprawdę chcesz tylko sprawdzić, czyDJANGO_DEVELOPMENT
zmienna środowiskowa istnieje (tjis not None
.).settings_dev.py
ładuję się na serwerze.is not None
czek. Równieżos.getenv
jest skrótemZwykle mam jeden plik ustawień na środowisko i wspólny plik ustawień:
Każdy z moich plików środowiskowych ma:
Dzięki temu mogę w razie potrzeby zastąpić wspólne ustawienia (poprzez dodanie modyfikacji poniżej tej sekcji).
Następnie wybieram pliki ustawień do użycia, łącząc je z settings.py:
źródło
import *
? Czy wyłączysz ten czek? Zapakowałem ten import w plik,exec()
ale nie mogę mieć warunków warunkowych dla zmiennych, które nie są zdefiniowane w tym pliku, ani nie mogę zmienićINSTALLED_APPS
zmiennej, ponieważ jest „niezdefiniowana”Oto jak robię to w 6 prostych krokach:
Utwórz folder w katalogu projektu i nadaj mu nazwę
settings
.Struktura projektu:
Tworzenie cztery pliki Pythona wewnątrz
settings
katalogu mianowicie__init__.py
,base.py
,dev.py
iprod.py
Pliki ustawień:
Otwórz
__init__.py
i wypełnij następującą treścią:init .py:
Otwórz
base.py
i wypełnij wszystkie typowe ustawienia (które będą używane zarówno w produkcji, jak i programowaniu). Na przykład:base.py:
Otwórz
dev.py
i dołącz te rzeczy, które są specyficzne dla rozwoju, na przykład:dev.py:
Otwórz
prod.py
i dołącz te rzeczy, które są specyficzne dla produkcji, na przykład:prod.py:
źródło
Utwórz wiele
settings*.py
plików, ekstrapolując zmienne, które muszą się zmieniać w zależności od środowiska. Następnie na końcusettings.py
pliku głównego :Zachowujesz oddzielne
settings_*
pliki dla każdego etapu.U góry
settings_dev.py
pliku dodaj to:Aby zaimportować zmienne, które musisz zmodyfikować.
Ten wpis wiki zawiera więcej pomysłów na podział ustawień.
źródło
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
aby uzyskać pełną nazwę modułu, a następnieglobals().update(vars(sys.modules[modname]))
. Uważam, że dobrze mi to wychodzi. Oczywiście rezygnacja z programistycznego określania nazwy modułu na rzecz łańcucha prawdopodobnie zadziałaby w większości przypadków.Używam niesamowitych konfiguracji django , a wszystkie ustawienia są przechowywane w moim
settings.py
:Aby skonfigurować projekt Django, po prostu postępowałem zgodnie z dokumentacją .
źródło
Oto podejście, którego używamy:
settings
moduł do ustawień podzielone na wiele plików do odczytu;.env.json
plik do przechowywania poświadczeń i parametrów, które chcemy wykluczyć z naszego repozytorium git, lub które są specyficzne dla środowiska naturalnego;env.py
plik do zapoznania się z.env.json
plikuBiorąc pod uwagę następującą strukturę:
Z
.env.json
takimi jak:Oraz
project_name/env.py
:Możemy mieć następujące ustawienia:
zalety tego rozwiązania to:
.env.json
takimi jak programowanie, tworzenie i produkcja;Mam nadzieję, że to pomoże. Po prostu daj mi znać, jeśli zobaczysz jakieś zastrzeżenia dotyczące tego rozwiązania.
źródło
env
ma zastąpićdev
,prod
itd.? Co znajduje się w starymsettings.py
pliku? Co jeststorage.py
idatabase.py
?env.py
plik , abyś mógł wybrać, za pomocą zmiennej środowiskowej, który plik załadowaćUżywam następującej struktury plików:
Podobnie
__init__.py
jest z linkiem (ln w unixie lub mklink w oknach) dolocal.py
lub może być,prod.py
więc konfiguracja jest nadal wproject.settings
module jest czysta i zorganizowana, a jeśli chcesz użyć określonej konfiguracji, możesz użyć zmiennej środowiskowejDJANGO_SETTINGS_MODULE
doproject.settings.prod
jeśli trzeba aby uruchomić polecenie dla środowiska produkcyjnego.W plikach
prod.py
ilocal.py
:i
shared.py
plik pozostaje jako globalny bez określonych konfiguracji.źródło
opierając się na odpowiedzi CS01:
jeśli masz problemy ze zmienną środowiskową, ustaw jej wartość na łańcuch (np. zrobiłem
DJANGO_DEVELOPMENT="true"
).Zmieniłem również przepływ pracy plików cs01 w następujący sposób:
W ten sposób Django nie musi czytać całego pliku ustawień przed uruchomieniem odpowiedniego pliku ustawień. To rozwiązanie jest przydatne, jeśli plik produkcyjny wymaga rzeczy, które znajdują się tylko na serwerze produkcyjnym.
Uwaga: w Pythonie 3 zaimportowane pliki muszą mieć
.
dołączony (np.from .settings_dev import *
)źródło
Jeśli chcesz zachować 1 plik ustawień, a Twój programistyczny system operacyjny różni się od produkcyjnego, możesz umieścić go na dole pliku settings.py:
Czytaj więcej: Jak sprawdzić system operacyjny w Pythonie?
źródło
Wydaje się, że odpowiedź na to pytanie została udzielona, jednak metoda, której używam w połączeniu z kontrolą wersji, jest następująca:
Skonfiguruj plik env.py w tym samym katalogu, co ustawienia w moim lokalnym środowisku programistycznym, które również dodaję do .gitignore:
env.py:
.gitignore:
settings.py:
Po prostu uważam, że to działa i jest znacznie bardziej eleganckie - dzięki env.py łatwo jest zobaczyć nasze lokalne zmienne środowiskowe i możemy sobie z tym wszystkim poradzić bez wielu plików settings.py lub podobnych. Ta metoda pozwala na użycie wszelkiego rodzaju lokalnych zmiennych środowiskowych, których nie chcielibyśmy ustawić na naszym serwerze produkcyjnym. Wykorzystując .gitignore poprzez kontrolę wersji, zapewniamy również płynną integrację wszystkiego.
źródło
Config
klasie wewnątrzenv.py
pliku. Następnie zamiastimport *
modułu można zaimportować plikfrom env import Config
. W ten sposób nie musisz też tego używać, jeślios.path
sprawdzisz, co znacznie upraszcza całą sprawę.Użyj
settings.py
do produkcji. W tym samym katalogu utwórzsettings_dev.py
dla przesłonięć.Na maszynie deweloperskiej uruchom aplikację Django z:
Na maszynie do produkcji działaj tak, jakbyś właśnie miał
settings.py
i nic więcej.ZALETY
settings.py
(używany do produkcji) jest całkowicie niezależny od faktu, że istnieją jakiekolwiek inne środowiska.settings_dev.py
. Nie ma potrzeby, aby zebrać konfiguracje rozproszonesettings_prod.py
,settings_dev.py
asettings_shared.py
.źródło
W przypadku problemu z ustawieniami plików wybieram kopiowanie
Kiedy uruchomisz django, zostanie uruchomiony __init__py. W tej chwili
settings.py in setting1_dir
wymienisettings.py in Project
.Jak wybrać inne środowisko?
__init__.py
bezpośrednio.__init__.py
.__init__.py
przeczytajmy tę zmienną.Po co używać w ten sposób?
Ponieważ nie lubię tak wielu plików w tym samym katalogu, zbyt wiele plików zmyli innych partnerów i niezbyt dobrze dla IDE. (IDE nie może znaleźć pliku, którego używamy)
Jeśli nie chcesz widzieć tych wszystkich szczegółów, możesz podzielić projekt na dwie części.
źródło
Używam innego pliku app.yaml do zmiany konfiguracji między środowiskami w silniku aplikacji w chmurze Google.
Możesz użyć tego do utworzenia połączenia proxy w poleceniu terminala:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
Plik: app.yaml
źródło
To jest moje rozwiązanie z różnymi środowiskami do tworzenia, testowania i produkowania
źródło