Ci sono due tipi di "progetti" di Django che ho nella mia ~/projects/
directory, entrambi hanno una struttura leggermente diversa .:
- Siti Web autonomi
- Applicazioni collegabili
Sito Web autonomo
Principalmente progetti privati, ma non devono esserlo. Di solito si presenta così:
~/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
...
impostazioni
Le impostazioni principali sono quelle di produzione. Altri file (ad es. staging.py
,
development.py
) Importano semplicemente tutto production.py
e sovrascrivono solo le variabili necessarie.
Per ogni ambiente, esistono file di impostazioni separati, ad es. produzione, sviluppo. Ho alcuni progetti che ho anche testato (per test runner), messa in scena (come controllo prima della distribuzione finale) e heroku (per la distribuzione su heroku).
Requisiti
Preferisco specificare direttamente i requisiti in setup.py. Solo quelli richiesti per l'ambiente di sviluppo / test in cui mi trovo requirements_dev.txt
.
Alcuni servizi (ad es. Heroku) devono essere presenti requirements.txt
nella directory principale.
setup.py
Utile quando si distribuisce il progetto usando setuptools
. Si aggiunge manage.py
a PATH
, quindi posso eseguire manage.py
direttamente (ovunque).
App specifiche del progetto
Ho usato per mettere queste app nella project_name/apps/
directory e importarle usando le relative importazioni.
File template / static / locale / test
Ho inserito questi modelli e file statici in modelli globali / directory statiche, non all'interno di ogni app. Questi file sono generalmente modificati da persone che non si preoccupano affatto della struttura del codice di progetto o di Python. Se sei uno sviluppatore full-stack che lavora da solo o in un piccolo team, puoi creare modelli per-app / directory statica. È davvero solo una questione di gusti.
Lo stesso vale per le impostazioni locali, sebbene a volte sia conveniente creare una directory delle impostazioni locali separata.
Di solito è meglio posizionare i test all'interno di ogni app, ma di solito ci sono molti test di integrazione / funzionali che testano più app che lavorano insieme, quindi la directory dei test globali ha senso.
Directory Tmp
Esiste una directory temporanea nella radice del progetto, esclusa da VCS. Viene utilizzato per archiviare file multimediali / statici e database sqlite durante lo sviluppo. Tutto in tmp può essere eliminato in qualsiasi momento senza problemi.
vIRTUALENV
Preferisco virtualenvwrapper
e posiziono tutti i venv nella ~/.venvs
directory, ma potresti metterlo all'interno tmp/
per tenerlo insieme.
Modello di progetto
Ho creato un modello di progetto per questa configurazione, django-start-template
Distribuzione
La distribuzione di questo progetto è la seguente:
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
È possibile utilizzare rsync
invece di git
, ma è comunque necessario eseguire batch di comandi per aggiornare l'ambiente.
Di recente, ho realizzato [django-deploy][2]
un'app che mi consente di eseguire un singolo comando di gestione per aggiornare l'ambiente, ma l'ho usata solo per un progetto e sto ancora sperimentando.
Schizzi e bozze
Bozza di modelli che inserisco nella templates/
directory globale . Immagino che uno possa creare una cartella sketches/
nella radice del progetto, ma non l'ho ancora usato.
Applicazione collegabile
Queste app sono generalmente pronte per essere pubblicate come open-source. Ho preso un esempio di seguito da Django-forme
~/projects/django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
Il nome delle directory è chiaro (spero). Ho messo i file di test fuori dalla directory dell'app, ma non importa. È importante fornire README
e setup.py
, quindi il pacchetto può essere facilmente installato pip
.