Sobes.tech
Middle

Leg uit hoe de verwerking van HTTP-verzoeken in Django plaatsvindt.

sobes.tech AI

Antwoord van AI

De verwerking van een HTTP-verzoek in Django omvat verschillende hoofd fasen:

  1. WSGI-server: Het verzoek komt bij de WSGI-server (bijvoorbeeld Gunicorn, uWSGI) die de standaard interface is tussen webservers en Python webapplicaties.
  2. wsgi.py: De WSGI-server geeft het verzoek door aan de Django-toepassing via het bestand wsgi.py, meestal gelegen in de hoofdmap van het project. Dit bestand bevat het WSGI-object van de toepassing.
    # 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() # WSGI-object van de toepassing
    
  3. Middleware: Het verzoek doorloopt een keten van geconfigureerde middleware. Middleware is een softwarelaag die verzoeken en antwoorden verwerkt. Ze kunnen authenticatie, sessiebeheer, headerverwerking en andere functies uitvoeren.
    # 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',
        # Jouw aangepaste middleware
    ]
    
  4. URL Resolver (urls.py): Na het passeren van middleware, bepaalt Django welke View de aanvraag moet verwerken op basis van de URL-patronen gedefinieerd in urls.py van het project.
    # urls.py (projectniveau)
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('my_app/', include('<my_app>.urls')), # Insluiten van URL's van de app
    ]
    
    
    # urls.py (app-niveau)
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('item/<int:item_id>/', views.detail, name='detail'),
    ]
    
  5. View: Het gevonden URL-patroon is gekoppeld aan een specifieke functie of klasse View. De View-functie (of methode van de klasse-gebaseerde View) ontvangt een HttpRequest object als argument en bevat de logica voor het verwerken van de aanvraag.
    # 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. Model (optioneel): De View kan interageren met modellen (API naar Django ORM database) om gegevens op te halen of op te slaan.
    # 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 (optioneel): De View kan Django-templates gebruiken om de HTML-respons te genereren.
    <!-- 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. Respons: De View retourneert een HttpResponse object of een subklasse ervan (bijvoorbeeld, JsonResponse, RedirectResponse). Dit object bevat de body van de reactie en de bijbehorende headers.
  9. Middleware (omgekeerde keten): Het HttpResponse-object doorloopt dezelfde middleware in omgekeerde volgorde die de aanvraag heeft verwerkt. Middleware kan de reactie aanpassen voordat deze naar de client wordt gestuurd.
  10. WSGI-server: Het uiteindelijke antwoord wordt verzonden naar de client via de WSGI-server.