Sobes.tech
Middle

Selgitage, kuidas toimub HTTP-päringute töötlemine Django-s.

sobes.tech AI

Vastus AI-lt

Päringutöötlus toimub middleware'i kaudu, seejärel jõuab see URL-i marsruutijani, mis määrab vastava vaate. Vaade töötleb äriloogika ja tagastab HTTP-vastuse, mis samuti läbib middleware'i enne kliendile saatmist.

Peamised etapid:

  1. Sissejuhatus rakendusse: Päring võetakse vastu veebiserverilt (näiteks Nginx) ja edastatakse WSGI-serverile (Gunicorn, uWSGI), mis suhtleb Django rakendusega.

  2. Middleware: Päring läbib seeriat middleware'id. Iga middleware võib muuta päringut (process_request), teha toiminguid pärast vaate töötlemist (process_view) või töödelda erandeid (process_exception).

    # Näide kasutaja middleware'ist
    def simple_middleware(get_response):
        def middleware(request):
            # LOOGIKA ENNE vaate töötlemist
            print(f"Töötleb päringut {request.path}")
    
            response = get_response(request)
    
            # LOOGIKA PÄRAST vaate töötlemist
            print(f"Vastus koos staatusega {response.status_code} saadetud {request.path}")
    
            return response
        return middleware
    
  3. URL-i marsruutimine: Django võrdleb päringu URL-i urls.py failis määratletud mustritega. Kui sobiv vaade leitakse (funktsioon või klass):

    # urls.py näide
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('articles/<int:article_id>/', views.article_detail),
        path('about/', views.about_page),
    ]
    
  4. Vaade (View): Vaade saab HttpRequest objekti, töötleb päringut (näiteks andmebaasiga suhtlemise kaudu ORM-i kaudu, äriloogika teostamisega) ja loob HttpResponse objekti.

    # views.py näide
    from django.http import HttpResponse
    from .models import Article
    
    def article_detail(request, article_id):
        try:
            article = Article.objects.get(pk=article_id)
            return HttpResponse(f"Artikli detailid: {article.title}")
        except Article.DoesNotExist:
            return HttpResponse("Artikkel ei leitud", status=404)
    
    def about_page(request):
        return HttpResponse("Meist leht")
    
  5. Middleware (tagasipööre): Objekti HttpResponse läbib samuti middleware'i seeria tagurpidi. Middleware võib muuta vastust (process_response).

  6. Vastuse saatmine: WSGI-server saadab HTTP-vastuse kliendile läbi veebiserveri.

Skeem:

Kliendi <-> Veebiserver <-> WSGI-server <-> Middleware (Päring) <-> URL-i marsruutija <-> Vaade <-> ORM / Ärilogika <-> Vaade <-> Middleware (Vastus) <-> WSGI-server <-> Veebiserver <-> Klient