Что происходит при запросе к Django
Вопрос
Расскажите, что происходит, когда пользователь открывает страницу на Django.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сервер приложений создаёт `HttpRequest` через WSGI или ASGI
Middleware по списку: безопасность, сессия, CSRF, аутентификация
URL-резолвер находит вьюху и параметры по urlpatterns
Вьюха работает с ORM и шаблоном, возвращает HttpResponse
Ответ проходит middleware в обратном порядке
Исключения превращаются в 404 или 500 через обработчики
Что могут спросить следом
- Где бы вы добавили замер времени всех запросов?
- Что будет, если middleware вернёт ответ сам?
Разбор
Образцовый ответ: «Запрос приходит через nginx в gunicorn или uvicorn, и обработчик Django превращает его в объект HttpRequest. Дальше запрос проходит middleware из списка MIDDLEWARE сверху вниз: SecurityMiddleware может перенаправить на HTTPS, SessionMiddleware загружает сессию, CsrfViewMiddleware проверяет токен для небезопасных методов, AuthenticationMiddleware кладёт пользователя в request.user. Любой middleware может сам вернуть ответ, и тогда до вьюхи запрос не дойдёт. Затем URL-резолвер сопоставляет путь с urlpatterns, конвертеры приводят параметры к нужным типам, и вызывается вьюха. Она достаёт данные через ORM, рендерит шаблон или собирает JSON и возвращает HttpResponse. Ответ идёт обратно через middleware снизу вверх, там, например, ставятся заголовки и cookie. Если вьюха бросила Http404 или PermissionDenied, Django превратит их в соответствующие ответы, а необработанное исключение станет 500 и попадёт в логи. Замер времени всех запросов я бы сделал своим middleware».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Где держать бизнес-логику в Django
Следующий вопрос
Состояние в экземпляре middleware