Sobes.tech
Middle

Magyarázza el, hogyan történik a HTTP-kérések feldolgozása a Django-ban.

sobes.tech MI

Válasz az MI-től

A HTTP-kérések feldolgozása Django-ban több fő lépést foglal magában:

  1. WSGI szerver: A kérés a WSGI szerverhez érkezik (pl. Gunicorn, uWSGI), amely a web szerverek és a Python webalkalmazások közötti szabványos interfész.
  2. wsgi.py: A WSGI szerver átadja a kérést a Django alkalmazásnak a wsgi.py fájlon keresztül, amely általában a projekt gyökérkönyvtárában található. Ez a fájl tartalmazza az alkalmazás WSGI objektumát.
    # 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 objektum
    
  3. Middleware: A kérés átmegy a konfigurált middleware láncon. A middleware egy szoftverréteg, amely a kéréseket és válaszokat dolgozza fel. Felhasználható hitelesítésre, munkamenetek kezelésére, fejlécfeldolgozásra és más funkciókra.
    # 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',
        # Saját middleware
    ]
    
  4. URL Resolver (urls.py): A middleware feldolgozása után a Django meghatározza, melyik View fogja kezelni a kérést az urls.py fájlban megadott URL-sablonok alapján.
    # urls.py (projekt szint)
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('my_app/', include('<my_app>.urls')), # Az alkalmazás URL-jeinek beillesztése
    ]
    
    
    # urls.py (alkalmazás szint)
    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: A megtalált URL-sablon egy adott függvényhez vagy osztályhoz van kötve. A View-függvény (vagy osztály alapú View-módszer) megkapja az HttpRequest objektumot argumentumként, és tartalmazza a kérés feldolgozási logikáját.
    # views.py
    from django.shortcuts import render, get_object_or_400
    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_400(Item, pk=item_id)
        return render(request, 'my_app/detail.html', {'item': item})
    
  6. Model (opcionális): A View kapcsolatba léphet modellekkel (API a Django ORM adatbázishoz) az adatok lekérdezéséhez vagy mentéséhez.
    # 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. Sablon (opcionális): A View használhat Django sablonokat az HTML-válasz generálásához.
    <!-- 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. Válasz: A View visszaad egy HttpResponse objektumot vagy annak származékát (pl. JsonResponse, RedirectResponse). Ez az objektum tartalmazza a válasz testét és a kapcsolódó fejlécsorokat.
  9. Middleware (fordított lánc): A HttpResponse objektum visszafelé halad ugyanazon middleware-eken keresztül, amelyek a kérést feldolgozták. A middleware módosíthatja a választ, mielőtt az elküldésre kerül a kliensnek.
  10. WSGI szerver: A végső válasz a WSGI szerver által kerül elküldésre a kliensnek.