Analyse de la structure du projet Django

En comprenant la structure d'un projet Django, nous pouvons organiser le code plus efficacement, suivre les bonnes pratiques de Django et créer des applications web maintenables.

Dans le chapitre précédent, nous avons appris à utiliserdjango-admin startprojectLorsque la commande crée un nouveau projet, Django génère automatiquement la structure de base suivante :
myproject/
│
├── manage.py
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Utilisez django-admin pour créer le projet HelloWorld :

django-admin startproject HelloWorld

Après la création, nous pouvons afficher la structure des répertoires du projet :

Fichier/répertoireDescription détaillée
manage.pyL'outil de gestion en ligne de commande pour les projets Django, qui encapsuledjango-admindes fonctionnalités, et définit automatiquementDJANGO_SETTINGS_MODULELa variable d'environnement pointe vers la configuration du projet actuel. Toutes les commandes de gestion du projet sont exécutées via celui-ci, comme :
- runserver: Démarrer le serveur de développement
- makemigrations: Générer les fichiers de migration de la base de données
- shell: Lancer le shell Python avec l'ORM
db.sqlite3Le fichier de base de données SQLite utilisé par Django par défaut, qui est automatiquement généré après la première exécution demigrateIl est automatiquement généré après l'exécution de la commande. Il convient aux environnements de développement ; pour la production, il est recommandé de passer à PostgreSQL/MySQL. L'emplacement du fichier est déterminé parsettings.pyinDATABASES['default']['NAME']définition.
__pycache__/Répertoire de cache de bytecode généré par l'interpréteur Python, contenant.pycfichier, utilisé pour accélérer le chargement des modules. Il n'a pas besoin d'être validé dans le contrôle de version (devrait être dans.gitignoreignoré dans).


Analyse des fichiers principaux

manage.py

manage.pyest le point d'entrée de l'outil en ligne de commande pour les projets Django, qui fournit de nombreuses commandes utiles :

Exemple

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # Gérer les erreurs d'importation
        pass
    execute_from_command_line(sys.argv)

Exemples de commandes courantes :

  • python manage.py runserver- Démarrer le serveur de développement
  • python manage.py migrate- Appliquer les migrations de base de données
  • python manage.py createsuperuser- Créer un compte administrateur

settings.py

settings.pyest le fichier de configuration des projets Django, contenant tous les paramètres importants :

Exemple

# Éléments de configuration clés expliqués :
DEBUG = True  # Défini à True pendant le développement pour afficher les erreurs détaillées ; doit être défini à False en production.
ALLOWED_HOSTS = []  # Lorsque DEBUG=False, vous devez spécifier les domaines autorisés (par ex. ['example.com'])

INSTALLED_APPS = [
    'django.contrib.admin',    # Gestion de l'administration
    'django.contrib.auth',     # Système d'authentification
    'django.contrib.contenttypes',  # Framework de types de contenu
    'django.contrib.sessions', # Gestion des sessions
    'django.contrib.messages', # Framework de messages
    'django.contrib.staticfiles',  # Gestion des fichiers statiques
    # Une application personnalisée peut être ajoutée : 'myapp.apps.MyAppConfig'
]

DATABASES = {  # Configuration de la base de données
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',  # Utiliser la syntaxe pathlib
        # Exemple MySQL :
        # 'ENGINE': 'django.db.backends.mysql',
        # 'NAME': 'mydb',
        # 'USER': 'root',
        # 'PASSWORD': 'password',
    }
}

STATIC_URL = '/static/'  # Préfixe d'URL des fichiers statiques
STATICFILES_DIRS = [BASE_DIR / 'static']  # Répertoire de recherche des fichiers statiques en développement
MEDIA_URL = '/media/'   # Préfixe d'URL pour les fichiers téléversés par les utilisateurs
MEDIA_ROOT = BASE_DIR / 'media'  # Chemin de stockage des fichiers téléversés

urls.py (répartiteur d'URL)

Exemple

from django.contrib import admin
from django.urls import path, include

url = [
    path('admin/', admin.site.urls),  # Routes d'administration
    path('blog/', include('blog.urls')),  # Routage d'URL de sous-application
    # path('api/', include('api.urls', namespace='api')),
]
  • include(): Implémente la modularisation du routage, en séparant les routes des différentes applications dans leurs fichiers urls.py respectifs.
  • namespace: Utilisé pour éviter les conflits de noms lors de la résolution inverse des URL.

wsgi.py & asgi.py

FichierObjectif
wsgi.pyConfiguration WSGI (Web Server Gateway Interface), utilisée pour les serveurs synchrones traditionnels (comme Gunicorn, uWSGI). En production, le projet est démarré via ce fichier.
asgi.pyConfiguration ASGI (Asynchronous Server Gateway Interface), prend en charge les serveurs asynchrones (comme Daphne, Uvicorn). Utilisée pour WebSocket ou les vues asynchrones.

Répertoire d'extension (non généré automatiquement, mais couramment utilisé)

HelloWorld/
├── apps/               # 推荐:存放所有自定义应用
│   └── blog/          # 示例应用
├── static/             # 静态文件(CSS/JS/图片)
├── media/              # 用户上传文件
├── templates/          # 全局模板目录
└── requirements.txt    # 项目依赖列表

1. répertoire apps/ (structure recommandée)

Gérer les applications de manière centralisée, en évitant de les disperser dans le répertoire racine du projet.

Il faut configurer le chemin Python dans settings.py :

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. Fichiers statiques et fichiers multimédias

  • static/Stocke les fichiers CSS, JavaScript, images, etc., accessibles via STATIC_URL.

  • media/: Les fichiers téléversés par les utilisateurs (tels que les avatars) sont accessibles via MEDIA_URL. Le serveur doit être configuré pour fournir l'accès pendant le développement :

    # urls.py(仅开发环境)
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Structure d'une application Django

Dans Django, un projet peut contenir plusieurs applications. En utilisantpython manage.py startapp myappAprès la création d'une nouvelle application, la structure suivante est générée :

myapp/
│
├── migrations/
│   └── __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py

Fichiers principaux de l'application

models.py

Définit les modèles de données, correspondant aux tables de la base de données :

Exemple

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField()
   
    def __str__(self):
        return self.name

views.py

Gérer la logique métier, renvoyer les réponses :

Exemple

from django.shortcuts import render
from .models import Product

def product_list(request):
    products = Product.objects.all()
    return render(request, 'myapp/product_list.html', {'products':})

admin.py

Configurer le backend d'administration Django

Exemple

from django.contrib import admin
from .models import Product

@admin.register(register⟧)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price')

Exemple de structure complète de projet

La structure complète d'un projet Django typique est la suivante :

myproject/
│
├── manage.py
├── requirements.txt
├── static/
│   ├── css/
│   ├── js/
│   └── images/
├── media/
├── templates/
│   └── base.html
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py
    └── asgi.py
└── myapp1/
    ├── migrations/
    ├── templates/
    │   └── myapp1/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py
└── myapp2/
    └── ... (类似结构)

Descriptions des répertoires importants

répertoire migrations

Stocke les fichiers de migration de base de données. Django utilise ces fichiers pour suivre les modifications de modèle et les synchroniser avec la base de données.

répertoire static

Stocke les fichiers statiques (CSS, JavaScript, images, etc.), qui sont collectés vers un emplacement désigné lors du déploiement.

répertoire templates

Stocke les fichiers de gabarit HTML. Django utilise le langage de gabarit pour générer dynamiquement des pages.

répertoire media

Stocke les fichiers téléversés par les utilisateurs, qui doivent être configurés dans settings.py :

Exemple

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Suggestions de bonnes pratiques

  1. Séparation du projet et de l'application: Maintenir l'indépendance de chaque application pour en faciliter la réutilisation
  2. Configuration de l'environnement: Utiliser différents fichiers de configuration pour distinguer les environnements de développement et de production
  3. Gestion des fichiers statiquesUtilisé pendant le développementSTATICFILES_DIRSUtilisé en productioncollectstatic
  4. Conception des URL: Définir les URL au niveau de l'application, puis les inclure au niveau du projet
  5. Organisation des gabaritsCréer un sous-répertoire pour chaque application afin d'y stocker les gabarits

Différences entre les environnements de production et de développement

Fichier/ConfigurationEnvironnement de développementEnvironnement de production
DEBUGTrue(Afficher les détails de l'erreur)False(Masquer les erreurs, journaliser dans un fichier)
base de donnéesSQLite (par défaut)PostgreSQL/MySQL (Optimisation des performances)
Fichiers statiquesrunserverService automatiqueUtilisationcollectstaticCollecter vers le CDN
ALLOWED_HOSTSListe vide ou['localhost']Doit configurer le domaine (par ex.['example.com'])
autres extensions