Es gibt zwei Arten von Django "Projekten", die ich in meinem ~/projects/
Verzeichnis habe, beide haben eine etwas unterschiedliche Struktur:
- Eigenständige Websites
- Steckbare Anwendungen
Eigenständige Website
Meist private Projekte, muss es aber nicht sein. Es sieht normalerweise so aus:
~/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
...
die Einstellungen
Die Haupteinstellungen sind Produktionseinstellungen. Andere Dateien (zB. staging.py
,
development.py
) Einfach importiert alles aus production.py
und nur notwendige Variablen außer Kraft setzen.
Für jede Umgebung gibt es separate Einstellungsdateien, z. Produktion, Entwicklung. Ich habe einige Projekte, die ich auch testen (für Test Runner), Staging (als Überprüfung vor der endgültigen Bereitstellung) und Heroku (für die Bereitstellung auf Heroku) Einstellungen.
Bedarf
Ich spezifiziere die Anforderungen eher direkt in setup.py. Nur die für die Entwicklungs- / Testumgebung erforderlichen, in der ich mich befinde requirements_dev.txt
.
Einige Dienste (z. B. Heroku) müssen requirements.txt
im Stammverzeichnis vorhanden sein.
setup.py
Nützlich beim Bereitstellen von Projekten mit setuptools
. Sie fügt hinzu , manage.py
zu PATH
, so dass ich laufen kann manage.py
(überall) direkt.
Projektspezifische Apps
Ich habe diese Apps in ein project_name/apps/
Verzeichnis gestellt und sie mit relativen Importen importiert.
Templates / static / locale / tests files
Ich habe diese Vorlagen und statischen Dateien in einem globalen Vorlagen- / statischen Verzeichnis abgelegt, nicht in jeder App. Diese Dateien werden normalerweise von Personen bearbeitet, denen Projektstruktur oder Python überhaupt nicht wichtig sind. Wenn Sie ein Full-Stack-Entwickler sind, der alleine oder in einem kleinen Team arbeitet, können Sie pro App Vorlagen / statisches Verzeichnis erstellen. Es ist wirklich nur eine Frage des Geschmacks.
Gleiches gilt für das Gebietsschema, obwohl es manchmal praktisch ist, ein separates Gebietsschemaverzeichnis zu erstellen.
Tests sind normalerweise besser in jeder App zu platzieren, aber normalerweise gibt es viele Integrations- / Funktionstests, bei denen mehr Apps zusammenarbeiten, sodass ein globales Testverzeichnis sinnvoll ist.
Tmp-Verzeichnis
Im Projektstamm befindet sich ein temporäres Verzeichnis, das von VCS ausgeschlossen ist. Es wird verwendet, um Medien- / statische Dateien und SQLite-Datenbanken während der Entwicklung zu speichern. Alles in tmp konnte jederzeit problemlos gelöscht werden.
Virtualenv
Ich bevorzuge virtualenvwrapper
und lege alle venvs in ein ~/.venvs
Verzeichnis, aber du könntest es hineinlegen tmp/
, um es zusammen zu halten.
Projektvorlage
Ich habe eine Projektvorlage für dieses Setup erstellt, die Django-Start-Vorlage
Einsatz
Die Bereitstellung dieses Projekts erfolgt wie folgt:
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
Sie können rsync
anstelle von verwenden git
, müssen jedoch eine Reihe von Befehlen ausführen, um Ihre Umgebung zu aktualisieren.
Kürzlich habe ich eine [django-deploy][2]
App erstellt, mit der ich einen einzelnen Verwaltungsbefehl ausführen kann, um die Umgebung zu aktualisieren. Ich habe sie jedoch nur für ein Projekt verwendet und experimentiere immer noch damit.
Skizzen und Entwürfe
Entwurf von Vorlagen, die ich in ein globales templates/
Verzeichnis lege . Ich denke, man kann einen Ordner sketches/
im Projektstamm erstellen , hat ihn aber noch nicht verwendet.
Steckbare Anwendung
Diese Apps sind normalerweise für die Veröffentlichung als Open Source vorbereitet. Ich habe unten ein Beispiel aus Django-Forme genommen
~/projects/django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
Der Name der Verzeichnisse ist klar (hoffe ich). Ich habe Testdateien außerhalb des App-Verzeichnisses abgelegt, aber das spielt wirklich keine Rolle. Es ist wichtig, README
und bereitzustellen setup.py
, damit das Paket einfach über installiert werden kann pip
.