Je sais qu'il n'y a pas vraiment de bonne façon. Cependant, j’ai constaté qu’il était difficile de créer une structure de répertoires qui fonctionne bien et reste propre pour tous les développeurs et administrateurs. Il existe une structure standard dans la plupart des projets sur github. Mais cela ne montre pas comment organiser d'autres fichiers et tous les projets sur PC.
Quel est le moyen le plus pratique d'organiser tous ces répertoires sur une machine de développement? Comment les nommez-vous et comment vous connectez-vous et déployez-vous cela sur le serveur?
Les problèmes que je veux résoudre:
Il y a deux types de Django _ "projets" que j'ai dans mon répertoire ~/projects/
, les deux ont une structure légèrement différente.
Principalement des projets privés, mais pas nécessairement. Cela ressemble habituellement à ceci:
~/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
...
Les principaux paramètres sont ceux de production. Les autres fichiers (par exemple staging.py
, development.py
) importent simplement tout ce qui se trouve à partir de production.py
et ne remplacent que les variables nécessaires.
Pour chaque environnement, il existe des fichiers de paramètres distincts, par exemple. production, développement. Dans certains projets, j’ai également testé (pour test runner), staging (comme vérification avant le déploiement final) et heroku (pour le déploiement sur heroku).
Je spécifie plutôt les exigences directement dans setup.py. Seuls ceux requis pour l'environnement de développement/test que j'ai dans requirements_dev.txt
.
Certains services (par exemple, heroku) nécessitent d’avoir requirements.txt
dans le répertoire racine.
setup.py
Utile lors du déploiement de projet avec setuptools
. Il ajoute manage.py
à PATH
afin que je puisse exécuter manage.py
directement (n'importe où).
J'avais l'habitude de mettre ces applications dans le répertoire project_name/apps/
et de les importer à l'aide d'importations relatifs.
Je mets ces modèles et fichiers statiques dans le répertoire global templates/static, et non dans chaque application. Ces fichiers sont généralement édités par des personnes qui ne se soucient guère de la structure de code du projet ni de python. Si vous êtes un développeur de pile complète travaillant seul ou dans une petite équipe, vous pouvez créer un répertoire de modèles/statique par application. C'est vraiment juste une question de goût.
Il en va de même pour les paramètres régionaux, bien qu'il soit parfois pratique de créer un répertoire de paramètres régionaux distinct.
Il est généralement préférable de placer les tests dans chaque application, mais il existe généralement de nombreux tests d’intégration/fonctionnels qui testent un plus grand nombre d’applications fonctionnant ensemble. Par conséquent, le répertoire des tests globaux est logique.
Il existe un répertoire temporaire à la racine du projet, exclu de VCS. Il est utilisé pour stocker des fichiers multimédias/statiques et une base de données sqlite pendant le développement. Tout dans tmp peut être supprimé à tout moment sans aucun problème.
Je préfère virtualenvwrapper
et place tous les éléments dans le répertoire ~/.venvs
, mais vous pouvez le placer dans tmp/
pour le garder ensemble.
J'ai créé un modèle de projet pour cette configuration, Django-start-template
Le déploiement de ce projet est le suivant:
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
Vous pouvez utiliser rsync
au lieu de git
, mais vous devez néanmoins exécuter un lot de commandes pour mettre à jour votre environnement.
Récemment, j'ai créé l'application [Django-deploy][2]
, qui me permet d'exécuter une seule commande de gestion pour mettre à jour l'environnement, mais je ne l'ai utilisée que pour un projet et je l'expérimente encore.
Ébauche de modèles que je place dans le répertoire global templates/
. Je suppose que l’on peut créer un dossier sketches/
à la racine du projet, mais ne l’a pas encore utilisé.
Ces applications sont généralement préparées pour être publiées en open-source. J'ai pris l'exemple ci-dessous de Django-forme
~/projects/Django-app/
docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...
Le nom des répertoires est clair (j'espère). Je mets des fichiers de test hors du répertoire de l'application, mais cela n'a pas d'importance. Il est important de fournir README
et setup.py
, afin que le paquet soit facilement installé via pip
.
Ma réponse est inspirée par ma propre expérience professionnelle, et principalement dans le livre Two Scoops of Django que je recommande vivement, et où vous pouvez trouver une explication plus détaillée de tout. Je vais juste répondre à certains points, et toute amélioration ou correction sera la bienvenue. Mais il peut aussi y avoir des manières plus correctes d'atteindre le même but.
Projets
J'ai un dossier principal dans mon répertoire personnel où je gère tous les projets sur lesquels je travaille.
Fichiers sources
J'utilise personnellement la racine de projet Django en tant que racine de référentiel de mes projets. Mais dans le livre est recommandé de séparer les deux choses. Je pense que cette approche est meilleure et j'espère donc pouvoir commencer à effectuer le changement progressivement dans mes projets.
project_repository_folder/
.gitignore
Makefile
LICENSE.rst
docs/
README.rst
requirements.txt
project_folder/
manage.py
media/
app-1/
app-2/
...
app-n/
static/
templates/
project/
__init__.py
settings/
__init__.py
base.py
dev.py
local.py
test.py
production.py
ulrs.py
wsgi.py
Dépôt
Git ou Mercurial semblent être les systèmes de contrôle de versions les plus populaires parmi les développeurs de Django. Et les services d'hébergement les plus populaires pour les sauvegardes GitHub et Bitbucket .
Environnement virtuel
J'utilise virtualenv et virtualenvwrapper. Après avoir installé le second, vous devez configurer votre répertoire de travail. Le mien se trouve dans mon répertoire /home/envs , comme recommandé dans le guide d'installation de virtualenvwrapper. Mais je ne pense pas que le plus important est de savoir où il se trouve. La chose la plus importante lorsque vous travaillez avec des environnements virtuels est de maintenir le fichier requirements.txt à jour.
pip freeze -l > requirements.txt
Racine statique
Dossier de projet
Racine de média
Dossier de projet
README
Racine du référentiel
LICENCE
Racine du référentiel
Documents
Racine du référentiel. Ces packages python peuvent vous aider à gérer plus facilement votre documentation:
Croquis
Exemples
Base de données
Je n'aime pas créer un nouveau répertoire settings/
. J'ajoute simplement des fichiers nommés settings_dev.py
et settings_production.py
donc je n'ai pas à modifier le BASE_DIR
. L'approche ci-dessous augmente la structure par défaut au lieu de la modifier.
mysite/ # Project
conf/
locale/
en_US/
fr_FR/
it_IT/
mysite/
__init__.py
settings.py
settings_dev.py
settings_production.py
urls.py
wsgi.py
static/
admin/
css/ # Custom back end styles
css/ # Project front end styles
fonts/
images/
js/
sass/
staticfiles/
templates/ # Project templates
includes/
footer.html
header.html
index.html
myapp/ # Application
core/
migrations/
__init__.py
templates/ # Application templates
myapp/
index.html
static/
myapp/
js/
css/
images/
__init__.py
admin.py
apps.py
forms.py
models.py
models_foo.py
models_bar.py
views.py
templatetags/ # Application with custom context processors and template tags
__init__.py
context_processors.py
templatetags/
__init__.py
templatetag_extras.py
gulpfile.js
manage.py
requirements.txt
Je pense que ce:
settings.py
settings_dev.py
settings_production.py
c'est mieux que ça:
settings/__init__.py
settings/base.py
settings/dev.py
settings/production.py
Ce concept s'applique également à d'autres fichiers.
Je place généralement node_modules/
et bower_components/
dans le répertoire du projet, dans le dossier static/
par défaut.
Parfois, un répertoire vendor/
pour les sous-modules Git, mais généralement je les place dans le dossier static/
.
Voici ce que je suis sur mon système.
Tous les projets : Il existe un répertoire de projets dans mon dossier personnel , à savoir ~/projects
. Tous les projets reposent à l'intérieur.
Projet individuel : Je suis un modèle de structure normalisé utilisé par de nombreux développeurs appelés Django-skel pour des projets individuels. Il s’occupe essentiellement de tous vos fichiers statiques, de vos fichiers multimédias, etc.
Environnement virtuel : J'ai un dossier virtualenvs dans ma maison pour tout stocker. environnements virtuels dans le système, par exemple ~/virtualenvs
. Cela me donne la flexibilité de savoir ce que tous les environnements virtuels que j'ai et que je peux regarder peuvent être utilisés facilement
Les 3 ci-dessus sont les partitions principales de Mon environnement de travail.
Toutes les autres parties que vous avez mentionnées dépendent principalement du projet à la base (c’est-à-dire que vous pouvez utiliser différentes bases de données pour différents projets). Ils devraient donc résider dans leurs projets individuels.
Conformément à la documentation Django, la structure de répertoire appropriée à suivre est la suivante:
[projectname]/ <- project root
├── [projectname]/ <- Django root
│ ├── __init__.py
│ ├── settings/
│ │ ├── common.py
│ │ ├── development.py
│ │ ├── i18n.py
│ │ ├── __init__.py
│ │ └── production.py
│ ├── urls.py
│ └── wsgi.py
├── apps/
│ └── __init__.py
├── configs/
│ ├── Apache2_vhost.sample
│ └── README
├── doc/
│ ├── Makefile
│ └── source/
│ └── *snap*
├── manage.py
├── README.rst
├── run/
│ ├── media/
│ │ └── README
│ ├── README
│ └── static/
│ └── README
├── static/
│ └── README
└── templates/
├── base.html
├── core
│ └── login.html
└── README
Reportez-vous à https://Django-project-skeleton.readthedocs.io/en/latest/structure.html pour obtenir la dernière structure de répertoires.