802. Co to jest middleware w Django? Jak napisać własny middleware dodający nagłówek w odpowiedzi?

    Middleware w Django to (logika) / klasy, które mogą przetwarzać każde żądanie i odpowiedź przychodzące do i wychodzące z aplikacji Django.
    Daje możliwość dodawania globalnych funkcjonalności i modyfikowania zachowania aplikacji na poziomie całego projektu.
    
    Kluczowe momenty wywołań:
        Przed widokiem:
            process_request (opcjonalne).
            __call__ (właściwe wejście middleware).
    
        Podczas przetwarzania widoku:
            Widok działa.
            Jeśli wyjątek → process_exception.
    
        Po widoku:
            process_response modyfikuje odpowiedź.
    
    
    Tworzenie własnego middleware,
        Middleware w Django to klasa, która musi zawierać co najmniej jedną z następujących metod:
    class CustomMiddleware:
        __init__(self, get_response):
            Inicjalizacja middleware. get_response to funkcja wywoływana przy każdym żądaniu.
    
        __call__(self, request):
            Przetwarzanie żądania i generowanie odpowiedzi.
    
        Opcjonalne metody:
            process_request(self, request):
                Przetwarzanie żądania przed dotarciem do widoku.
            process_response(self, request, response):
                Przetwarzanie odpowiedzi przed jej wysłaniem do klienta.
            process_exception(self, request, exception):
                Obsługa wyjątków generowanych przez widok.
    
    
    Własny middleware dodający nagłówek w odpowiedzi:
    # middleware.py:
    
    class AddApiVersionMiddleware:
        def __init__(self, get_response):  # type: ignore
            self.get_response = get_response
    
        def __call__(self, request):  # type: ignore
            response = self.get_response(request)
    
            # Add a custom header
            response["X-API-Version"] = "v1.0"
    
            return response
    
    # settings.py
    MIDDLEWARE = [
        "library_api.middleware.AddApiVersionMiddleware",
        ...
    ]