277 lines
12 KiB
Markdown
277 lines
12 KiB
Markdown
---
|
||
title: Projets et applications
|
||
author: Steve Kossouho
|
||
---
|
||
|
||
# Structure d'un site web avec Django
|
||
|
||
----
|
||
|
||
## Notion de projet dans Django
|
||
|
||
Dans le jargon de [Django]{.naming}, un projet équivaut à un site complet que vous souhaitez créer.
|
||
Par exemple, si vous souhaitez créer un nouveau site web à déployer en production sur un serveur,
|
||
vous devez créer un [projet]{.naming} associé à celui-ci.
|
||
|
||
----
|
||
|
||
### Créer un nouveau projet
|
||
|
||
Puisqu'il vous faut un projet pour votre prochain site web, vous devez le créer.
|
||
Le framework Django vous impose une structure générale, qui peut être créée en ligne de commande.
|
||
(les frameworks front-end tels que [vue.js]{.naming} par exemple, utilisent le même système de
|
||
[bootstrapping]{.naming}).
|
||
|
||
Lorsque vous installez Django, le framework vous permet d'utiliser certains commandes dans un terminal.
|
||
Lesdites commandes vont vous permettre d'exécuter plusieurs tâches d'administration, dont la création de
|
||
la structure minimale d'un nouveau projet.
|
||
|
||
----
|
||
|
||
L'outil principal de gestion de projets Django est disponible sous le nom `django-admin`{.bash}.
|
||
Sa [documentation](https://docs.djangoproject.com/en/dev/ref/django-admin/) indique qu'on peut l'utiliser
|
||
pour réaliser diverses tâches de base, dont la création d'un nouveau répertoire de projet :
|
||
|
||
```bash {.number-lines}
|
||
django-admin startproject <name> [répertoire de création, ou name par défaut]
|
||
```
|
||
|
||
----
|
||
|
||
Cette commande est nécessaire et fait partie du processus normal de création de site.
|
||
En général, si le répertoire contenant le projet à réaliser existe déjà (par exemple lorsqu'on travaille avec PyCharm),
|
||
il faut porter une attention à ne pas créer une arborescence inutile; il faudra créer le projet Django directement à la
|
||
racine du répertoire de projet PyCharm :
|
||
|
||
```{.bash .numberLines}
|
||
django-admin startproject <name> .
|
||
```
|
||
|
||
Notez le `.` afin d'indiquer à la commande `startproject` de ne pas créer un sous-répertoire inutile
|
||
|
||
----
|
||
|
||
### Fichiers du package de projet
|
||
|
||
La commande `startproject` de l'outil `django-admin` vous crée un répertoire avec le minimum syndical
|
||
pour démarrer un projet avec des bases fiables (sécurité, fonctionnalités). Les fichiers créés par cette commande
|
||
sont presque tous nécessaires au bon fonctionnement d'un site web écrit avec Django.
|
||
|
||
----
|
||
|
||
| | Description |
|
||
|-------------------|--------------------------------------------------------------------------|
|
||
| `myproject/` | Répertoire racine du projet contenant les fichiers de configuration. |
|
||
| ├── `manage.py` | Script de gestion du projet Django (lancer le serveur, migrations). |
|
||
| └── `myproject/` | Répertoire contenant les paramètres et configurations du projet. |
|
||
| ├── `__init__.py` | Fichier vide marquant ce répertoire comme un package Python. |
|
||
| ├── `settings.py` | Fichier de configuration du projet Django (bases de données, etc.). |
|
||
| ├── `urls.py` | Fichier de routage des URLs pour les vues du projet. |
|
||
| ├── `asgi.py` | Point d’entrée pour le serveur ASGI (pour les applications asynchrones). |
|
||
| └── `wsgi.py` | Point d’entrée pour le serveur WSGI (pour les applications synchrones). |
|
||
|
||
|
||
----
|
||
|
||
#### Le fichier `manage.py`
|
||
|
||
Ce fichier est un script proposant exactement la même chose que l'outil en ligne de commande `django-admin`,
|
||
mais en prenant en compte les paramètres spécifiques au projet, tels qu'indiqués dans le fichier `settings.py`.
|
||
|
||
Par exemple, il peut être utilisé pour mettre à jour le schéma de la base de données d'un projet Django.
|
||
Lorsqu'un [projet]{.naming} est configuré pour utiliser des "plugins", ces derniers peuvent proposer de nouvelles commandes
|
||
utilisables avec l'outil.
|
||
|
||
```bash {.numberLines}
|
||
# Lancer le serveur web de développement pour tester son projet
|
||
python manage.py runserver
|
||
```
|
||
|
||
----
|
||
|
||
#### Le fichier `settings.py`
|
||
|
||
Ce fichier contient, sous la forme de simples constantes (ex. `CONSTANTE = valeur`{.python}),
|
||
la configuration actuelle de votre projet. Le nom des constantes à définir est documenté dans le détail
|
||
dans la [documentation officielle](https://docs.djangoproject.com/en/dev/topics/settings/),
|
||
mais la liste des paramètres disponibles est si longue qu'il faut la consulter uniquement
|
||
au besoin.
|
||
|
||
Parmi les paramètres intéressants, vous pouvez configurer votre accès aux **bases de données**,
|
||
choisir les répertoires par défaut pour stocker des fichiers, les "plugins" utilisés par votre
|
||
projet, et globalement tous les éléments de votre site.
|
||
|
||
----
|
||
|
||
#### Autres fichiers importants
|
||
|
||
- `urls.py` : fichiers définissant les URL principales de votre site
|
||
- `asgi.py` : fichier de serveur asynchrone pour la mise en production
|
||
- `wsgi.py` : fichier de serveur synchrone pour la mise en production
|
||
|
||
----
|
||
|
||
## Notion d'application dans Django
|
||
|
||
Un concept intéressant de Django est que si vous avez un projet,
|
||
vous avez la possibilité d'y brancher, à l'instar d'un système de plugins,
|
||
des packages Python réutilisables que l'on appelle [applications]{.naming}.
|
||
|
||
Une application Django est un **package Python** possédant une certaine structure (certains modules
|
||
sont détectés automatiquement par le framework Django).
|
||
Une application est normalement écrite pour définir un périmètre de fonctionnalités réutilisable
|
||
entre plusieurs projets. Par exemple, une application de _gestion de blog_, de _gestion d'images_, etc.
|
||
|
||
----
|
||
|
||
### Applications fournies par Django
|
||
|
||
Parmi les nombreuses applications fournies avec le framework Django, vous trouverez par exemple
|
||
des applications dédiées à plusieurs sujets :
|
||
|
||
| Module | Description |
|
||
|------------------------------|-----------------------------------------------------------------|
|
||
| `django.contrib.auth` | Gestion des utilisateurs, groupes et permissions (à venir) |
|
||
| `django.contrib.admin` | Une interface d'administration avancée (à venir) |
|
||
| `django.contrib.messages` | Système de messages génériques pour les utilisateurs. |
|
||
| `django.contrib.staticfiles` | Gestion des fichiers statiques tels que les fichiers CSS et JS. |
|
||
| `django.contrib.sites` | Gestion des sites multiples dans une seule application Django. |
|
||
|
||
|
||
N'oubliez pas que Django est extensible et que de nombreuses autres applications tierces sont disponibles
|
||
via le Python Package Index (PyPI) pour répondre à des besoins plus spécifiques.
|
||
|
||
----
|
||
|
||
### Créer une nouvelle application
|
||
|
||
Pour créer une application, vous pouvez utiliser la commande suivante dans un terminal :
|
||
|
||
```bash {.numberLines}
|
||
django-admin startapp <package>
|
||
```
|
||
|
||
Un package Python avec certains fichiers par défaut sera créé. Si cette application est spécifique à
|
||
votre projet de site plutôt qu'à une fonctionnalité réutilisable, vous pouvez la créer dans votre répertoire
|
||
de projet, mais si vous souhaitez travailler sur votre application pour la réutiliser dans plusieurs projets,
|
||
vous pourriez la créer sans même avoir un projet Django pour la tester.
|
||
|
||
Une application générale pour un projet est souvent nommée `core`, `main` ou `project` (si cela n'est pas déjà pris).
|
||
|
||
Une application développée pour être réutilisable sera de préférence développée de façon à être installable
|
||
avec l'outil `pip`, mais ceci est un sujet avancé.
|
||
|
||
----
|
||
|
||
### Fichiers créés dans le package d'application
|
||
|
||
Lorsque vous créez une application Django pour l'utiliser dans un projet, un package est généré
|
||
contenant des fichiers de base, mais pas tous fondamentaux.
|
||
|
||
| Fichier/Répertoire | Description |
|
||
|--------------------|-----------------------------------------------------------|
|
||
| `admin.py` | Module de configuration de l'administration. |
|
||
| `apps.py` | Module déclarant les informations de l'application. |
|
||
| `migrations/` | Package contenant les évolutions de la couche **Modèle**. |
|
||
| `models.py` | Module pour déclarer la couche **Modèle**. |
|
||
| `tests.py` | Module de tests automatisés (`unittest` par défaut). |
|
||
| `views.py` | Module pour déclarer la couche **Vue** et **Contrôleur**. |
|
||
|
||
|
||
----
|
||
|
||
#### Fichiers non créés avec l'application
|
||
|
||
Certains modules ou répertoires sont souvent présents dans des applications Django,
|
||
et doivent être créés au besoin, manuellement :
|
||
|
||
| Fichier/Répertoire | Description |
|
||
|---------------------|---------------------------------------------------------------|
|
||
| `fixtures/` | Répertoire contenant des dumps de données réutilisables. |
|
||
| `forms.py` | Module pour déclarer des formulaires. |
|
||
| `urls.py` | Module pour déclarer des routes locales à l'application. |
|
||
| `locale/` | Répertoire de gestion des catalogues de traduction. |
|
||
| `static/` | Répertoire contenant les fichiers statiques de l'application. |
|
||
| `templates/` | Répertoire contenant les templates de l'application. |
|
||
|
||
----
|
||
|
||
### Associer une application à un projet
|
||
|
||
Pour que Django reconnaisse que votre application est activée dans votre projet, ce qui permettra à
|
||
Django d'y détecter automatiquement certains fichiers (certains modules y seront détectés automatiquement),
|
||
vous devez préciser dans les paramètres de votre projet quelles applications vous souhaitez y inclure.
|
||
|
||
Pour cela, vous devez ajouter le nom qualifié de package de votre application dans le paramètre `INSTALLED_APPS`
|
||
du module `settings.py` du projet :
|
||
|
||
```python {.numberLines}
|
||
INSTALLED_APPS = [
|
||
"django.contrib.admin",
|
||
"django.contrib.auth",
|
||
"django.contrib.contenttypes",
|
||
"django.contrib.sessions",
|
||
"django.contrib.messages",
|
||
"django.contrib.staticfiles",
|
||
"app_package_name", # le nom d'import de votre package
|
||
]
|
||
```
|
||
|
||
Ce paramètre est une liste contenant les applications activées pour votre site. La configuration
|
||
par défaut est généralement saine et il est désirable de partir de celle-ci.
|
||
|
||
----
|
||
|
||
### Fichiers et répertoires standard
|
||
|
||
En règle générale, on peut aussi, dans une application, ajouter des répertoires ou fichiers plus
|
||
ou moins standard, tels que :
|
||
|
||
- `templates` : Répertoire de templates (découverts automatiquement par défaut)
|
||
- `static` : Répertoire de fichiers statiques spécifiques à l'application (ex. JS, CSS, images)
|
||
|
||
Lorsque nous ferons notre premier contenu HTML, nous y reviendrons.
|
||
|
||
----
|
||
|
||
## Commandes `django-admin`
|
||
|
||
La commande `django-admin`, accessible partout, est disponible en ligne de commande dans le terminal et
|
||
accepte les actions suivantes, entre autres :
|
||
|
||
- `startapp` : Créer une nouvelle application
|
||
- `startproject` : Créer un nouveau projet de site web
|
||
|
||
----
|
||
|
||
### Commandes uniquement pour les projets
|
||
|
||
Certaines commandes de l'outil `django-admin` sont dépendantes de la configuration d'un projet,
|
||
telle que précisée dans le module `settings.py`. C'est le cas par exemple des commandes suivantes :
|
||
|
||
- `runserver` : lancer un serveur web de test du projet (utilise les paramètres)
|
||
- `makemigrations` et `migrate` pour gérer la base de données (voir chapitre **ORM**)
|
||
- `makemessages` et `compilemessages` pour les traductions (voir chapitre **Traduction**)
|
||
|
||
Si votre commande nécessite d'avoir accès aux paramètres d'un projet Django, vous devez, au lieu
|
||
d'utiliser la commande `django-admin`, exécuter le module `manage.py` :
|
||
|
||
```bash {.numberLines}
|
||
./manage.py runserver # ou encore
|
||
python manage.py runserver
|
||
```
|
||
|
||
L'ensemble des commandes disponibles par défaut se trouve dans la [documentation officielle](https://docs.djangoproject.com/en/dev/ref/django-admin/).
|
||
|
||
----
|
||
|
||
## Récapitulatif
|
||
|
||
Démarrer un projet minimal, c'est simple avec PyCharm (**Community**) :
|
||
|
||
1. Créer un nouveau projet Python avec PyCharm
|
||
2. Installer Django : `pip install django`{.bash}
|
||
3. Démarrer un projet Django : `django-admin startproject <name> .`{.bash}
|
||
4. Créer une application Django : `django-admin startapp <name2>`{.bash}
|
||
5. Ajouter l'application au projet : `INSTALLED_APPS = [..., "name2"]`{.py}
|