Sobes.tech
Middle

Paaiškinkite, kaip vyksta HTTP užklausų apdorojimas Django.

sobes.tech AI

Atsakymas iš AI

HTTP užklausos apdorojimas Django apima keletą pagrindinių etapų:

  1. WSGI serveris: Užklausa atkeliauja į WSGI serverį (pavyzdžiui, Gunicorn, uWSGI), kuris yra standartinis sąsajos taškas tarp žiniatinklio serverių ir Python žiniatinklio programų:
  2. wsgi.py: WSGI serveris perduoda užklausą Django programai per wsgi.py failą, kuris paprastai yra projekto pagrindiniame kataloge. Šiame faile yra WSGI objektas:
    # 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 objektas
    
  3. Middleware: Užklausa pereina per sukonfigūruotą middleware grandinę. Middleware yra programinis sluoksnis, kuris apdoroja užklausas ir atsakymus. Jie gali atlikti autentifikaciją, sesijų valdymą, antraščių apdorojimą ir kitas funkcijas:
    # 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',
        # Jūsų papildomi middleware
    ]
    
  4. URL resolveris (urls.py): Po middleware, Django nustato, kuris View turi apdoroti užklausą, remiantis URL šablonais, kurie yra apibrėžti urls.py faile:
    # urls.py (projekto lygmenyje)
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('my_app/', include('<my_app>.urls')), # Programos URL įtraukimas
    ]
    
    
    # urls.py (programos lygmenyje)
    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: Surastas URL šablonas yra susijęs su tam tikra funkcija arba klasės pagrindu sukurta View. View funkcija (arba klasės pagrindu sukurta View metodas) priima HttpRequest objektą kaip argumentą ir turi užklausos apdorojimo logiką:
    # 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. Modelis (pasirinktinai): View gali sąveikauti su modeliais (Django ORM API) duomenų gavimui arba išsaugojimui:
    # 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. Šablonas (pasirinktinai): View gali naudoti Django šablonus HTML atsakymui generuoti:
    <!-- 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. Atsakymas: View grąžina HttpResponse objektą arba jo pogrupį (pavyzdžiui, JsonResponse, RedirectResponse). Šis objektas turi atsakymo turinį ir susijusias antraštes:
  9. Middleware (atvirkštinė grandinė): HttpResponse objektas pereina atgal per tą pačią middleware grandinę, kuri apdorojė užklausą. Middleware gali modifikuoti atsakymą prieš jį siunčiant klientui:
  10. WSGI serveris: Galutinis atsakymas siunčiamas WSGI serveriui klientui.