Sobes.tech
Middle

Explique comment le traitement des requêtes HTTP se déroule dans Django.

sobes.tech IA

Réponse de l'IA

Le traitement d'une requête HTTP dans Django comprend plusieurs étapes principales:

  1. Serveur WSGI : La requête arrive au serveur WSGI (par exemple, Gunicorn, uWSGI), qui est l'interface standard entre les serveurs web et les applications web Python.
  2. wsgi.py : Le serveur WSGI transmet la requête à l'application Django via le fichier wsgi.py, généralement situé dans le répertoire racine du projet. Ce fichier contient l'objet WSGI de l'application.
    # wsgi.py
    import os
    
    from django.core.wsgi import get_wsgi_application
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<your_project>.settings')
    
    application = get_wsgi_application() # Objet WSGI de l'application
    
  3. Middleware : La requête passe par une chaîne de middleware configurés. Le middleware est une couche logicielle qui traite les requêtes et réponses. Ils peuvent effectuer une authentification, une gestion des sessions, un traitement des en-têtes et d'autres fonctions.
    # settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        # Vos middleware personnalisés
    ]
    
  4. Résolveur d'URL (urls.py) : Après le passage par le middleware, Django détermine quelle Vue doit traiter la requête, en se basant sur les modèles d'URL définis dans urls.py du projet.
    # urls.py (niveau du projet)
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('my_app/', include('<my_app>.urls')), # Inclusion des URLs de l'application
    ]
    
    
    # urls.py (niveau de l'application)
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('item/<int:item_id>/', views.detail, name='detail'),
    ]
    
  5. Vue : Le modèle d'URL trouvé est associé à une fonction ou classe Vue spécifique. La fonction Vue (ou méthode de la Vue basée sur une classe) reçoit un objet HttpRequest en argument et contient la logique de traitement de la requête.
    # views.py
    from django.shortcuts import render, get_object_or_404
    from .models import Item
    
    def index(request):
        items = Item.objects.all()
        return render(request, 'my_app/index.html', {'items': items})
    
    def detail(request, item_id):
        item = get_object_or_404(Item, pk=item_id)
        return render(request, 'my_app/detail.html', {'item': item})
    
  6. Modèle (optionnel) : La Vue peut interagir avec des modèles (API à la base de données Django ORM) pour obtenir ou sauvegarder des données.
    # models.py
    from django.db import models
    
    class Item(models.Model):
        name = models.CharField(max_length=100)
        description = models.TextField()
    
        def __str__(self):
            return self.name
    
  7. Template (optionnel) : La Vue peut utiliser des modèles Django pour générer la réponse HTML.
    <!-- my_app/templates/my_app/index.html -->
    <h1>Items</h1>
    <ul>
    {% for item in items %}
        <li><a href="{% url 'detail' item.id %}">{{ item.name }}</a></li>
    {% endfor %}
    </ul>
    
  8. Réponse : La Vue retourne un objet HttpResponse ou sa sous-classe (par exemple, JsonResponse, RedirectResponse). Cet objet contient le corps de la réponse et les en-têtes associés.
  9. Middleware (chaîne inverse) : L'objet HttpResponse passe par la chaîne inverse à travers le même middleware qui a traité la requête. Les middleware peuvent modifier la réponse avant qu'elle ne soit envoyée au client.
  10. Serveur WSGI : La réponse finale est envoyée au client via le serveur WSGI.