Istnieją dwa rodzaje "projektów" Django, które mam w swoim ~/projects/
katalogu, oba mają nieco inną strukturę .:
- Niezależne witryny internetowe
- Aplikacje wtykowe
Samodzielna witryna internetowa
W większości projekty prywatne, ale nie musi. Zwykle wygląda to tak:
~/projects/project_name/
docs/ # documentation
scripts/
manage.py # installed to PATH via setup.py
project_name/ # project dir (the one which django-admin.py creates)
apps/ # project-specific applications
accounts/ # most frequent app, with custom user model
__init__.py
...
settings/ # settings for different environments, see below
__init__.py
production.py
development.py
...
__init__.py # contains project version
urls.py
wsgi.py
static/ # site-specific static files
templates/ # site-specific templates
tests/ # site-specific tests (mostly in-browser ones)
tmp/ # excluded from git
setup.py
requirements.txt
requirements_dev.txt
pytest.ini
...
Ustawienia
Główne ustawienia to ustawienia produkcyjne. Inne pliki, np. ( staging.py
,
development.py
) Po prostu wszystko z importu production.py
i nadpisać tylko niezbędne zmienne.
Dla każdego środowiska istnieją osobne pliki ustawień, np. produkcja, rozwój. W niektórych projektach mam również ustawienia testowania (dla test runner), staging (jako sprawdzenie przed ostatecznym wdrożeniem) i heroku (do wdrożenia w heroku).
Wymagania
Raczej określam wymagania bezpośrednio w setup.py. Tylko te, które są wymagane dla środowiska programistycznego / testowego, które mam w requirements_dev.txt
.
Niektóre usługi (np. Heroku) wymagają posiadania requirements.txt
w katalogu głównym.
setup.py
Przydatne podczas wdrażania projektu przy użyciu setuptools
. Dodaje manage.py
się PATH
, więc mogę uruchomić manage.py
bezpośrednio (gdziekolwiek).
Aplikacje specyficzne dla projektu
Kiedyś umieszczałem te aplikacje w project_name/apps/
katalogu i importowałem je za pomocą importu względnego.
Pliki szablonów / statyczne / locale / testy
Umieszczam te szablony i pliki statyczne w globalnym katalogu szablonów / statycznym, a nie w każdej aplikacji. Te pliki są zwykle edytowane przez osoby, które w ogóle nie przejmują się strukturą kodu projektu ani Pythonem. Jeśli jesteś programistą z pełnym stosem pracującym samodzielnie lub w małym zespole, możesz utworzyć szablony dla aplikacji / katalog statyczny. To naprawdę tylko kwestia gustu.
To samo dotyczy ustawień regionalnych, chociaż czasami wygodnie jest utworzyć oddzielny katalog ustawień regionalnych.
Testy zwykle lepiej jest umieścić w każdej aplikacji, ale zwykle jest wiele testów integracyjnych / funkcjonalnych, które testują więcej aplikacji pracujących razem, więc globalny katalog testów ma sens.
Katalog Tmp
W katalogu głównym projektu znajduje się katalog tymczasowy, wykluczony z VCS. Służy do przechowywania plików multimedialnych / statycznych i bazy danych sqlite podczas programowania. Wszystko w tmp można było usunąć w dowolnym momencie bez żadnych problemów.
Virtualenv
Wolę virtualenvwrapper
i umieszczam wszystkie venvy w ~/.venvs
katalogu, ale możesz umieścić je w środku, tmp/
aby zachować je razem.
Szablon projektu
Stworzyłem szablon projektu dla tej konfiguracji, django-start-template
Rozlokowanie
Wdrożenie tego projektu jest następujące:
source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt
# Update database, static files, locales
manage.py syncdb --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages
# restart wsgi
touch project_name/wsgi.py
Możesz użyć rsync
zamiast git
, ale nadal musisz uruchomić pakiet poleceń, aby zaktualizować środowisko.
Niedawno zrobiłem [django-deploy][2]
aplikację, która pozwala mi na uruchomienie jednej komendy zarządzającej aktualizacją środowiska, ale używałem jej tylko do jednego projektu i wciąż z nią eksperymentuję.
Szkice i szkice
Szkice szablonów umieszczam w templates/
katalogu globalnym . Wydaje mi się, że można utworzyć folder sketches/
w katalogu głównym projektu, ale jeszcze go nie używano.
Wtykowa aplikacja
Te aplikacje są zwykle przygotowywane do publikacji jako open-source. Poniżej wziąłem przykład z django-forme
~/projects/django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
Nazwy katalogów są jasne (mam nadzieję). Pliki testowe umieszczam poza katalogiem aplikacji, ale to naprawdę nie ma znaczenia. Ważne jest, aby zapewnić README
i setup.py
, więc pakiet można łatwo zainstalować za pomocą pip
.