Ответ
Жизненный цикл обработки HTTP-запроса в Django представляет собой конвейер, управляемый через интерфейс WSGI (или ASGI для асинхронных приложений).
Основные этапы:
- WSGI/ASGI Сервер: Веб-сервер (например, Nginx) передает запрос WSGI-серверу (Gunicorn, uWSGI), который взаимодействует с Django.
- WSGI Handler: Запрос поступает в точку входа Django (
wsgi.py). Здесь создается экземплярWSGIHandler, который управляет всем циклом. - Middleware (Request): Запрос проходит через все промежуточные слои (middleware) из
settings.py. Каждый middleware может модифицировать объектrequestперед тем, как он достигнет view. - URL-маршрутизация (Routing): Django пытается сопоставить URL запроса с шаблонами, определенными в
urls.py. Этот процесс называется "URL resolving". - View (Представление): Если совпадение найдено, Django вызывает соответствующую функцию или класс-представление (view), передавая ей объект
HttpRequest. - Бизнес-логика: View выполняет основную логику: обращается к моделям для работы с базой данных, обрабатывает данные форм, вызывает сервисы и т.д.
- Response: View должна вернуть экземпляр объекта
HttpResponse(или его подкласса, например,JsonResponse). - Middleware (Response): Объект
responseпроходит через все middleware в обратном порядке. На этом этапе они могут изменять ответ (например, добавлять заголовки). - Отправка клиенту:
WSGIHandlerотправляет финальный HTTP-ответ WSGI-серверу, который передает его клиенту.
Пример Middleware:
# middleware.py
class SimpleTimingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# Одноразовая настройка при старте сервера
def __call__(self, request):
# Код, выполняемый перед вызовом view
# Например, можно замерить время начала обработки
response = self.get_response(request)
# Код, выполняемый после вызова view
# Например, можно добавить кастомный заголовок в ответ
response['X-Custom-Header'] = 'my-value'
return response