---
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}
