Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 088новых вакансий за сутки·80 376вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании6 799
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python14 930
  • Облачные технологии11 077
  • QA вакансии3 282
  • Backend вакансии1 791
  • Инженер данных1 379
  • Продакт-менеджер819

Разработка

  • Android1 731
  • iOS1 605
  • AI вакансии858
  • Fullstack вакансии725
  • Frontend вакансии617
  • Mobile вакансии31

По стеку

  • Go8 182
  • Java5 283
  • Node.js1 704
  • Kotlin1 419
  • Rust1 360
  • .NET1 290
  • PHP551
  • C++394
  • C#369

DevOps и инфраструктура

  • Kubernetes6 326
  • Linux-инфраструктура4 784
  • DevOps вакансии4 737
  • Terraform / IaC3 487
  • Мониторинг и Observability1 598
  • CI/CD1 541
  • SRE494
  • Кибербезопасность242

Аналитика и данные

  • Data Scientist759
  • Аналитик данных739
  • Бизнес-аналитик680
  • Системный аналитик92

Другие направления

  • Проджект-менеджер327
  • UI/UX дизайн101
  • Ручное тестирование14

По регионам

  • Вакансии в США40 112
  • Вакансии в Европе16 478
  • Работа в России3 877
  • Вакансии в Канаде3 839

По формату

  • Удалённые вакансии64 386
  • Релокация в США40 296
  • Гибридная работа9 283
  • Офисная работа6 552

По уровню

  • Senior вакансии35 880
  • Middle вакансии17 118
  • Junior вакансии5 838

Сейчас нанимают

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме DjangoВсе вопросы
DjangoSeniorПроектирование систем

Объясните жизненный цикл запроса/ответа в Django — от разрешения URL до HTTP-ответа.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Запрос Django проходит: WSGIHandler → middleware (process_request) → URL resolver → view → middleware (process_response) → HttpResponse. Исключения перехватываются через process_exception в middleware.

2. Middleware: process_request

Middleware из MIDDLEWARE settings применяются сверху вниз на входящий запрос. Каждый middleware может:

  • Изменить request (добавить атрибут, декодировать тело)
  • Вернуть HttpResponse досрочно (короткое замыкание, остальные middleware и view не вызываются)
# Порядок важен — пример из settings.py
MIDDEWARE = [
    "django.middleware.security.SecurityMiddleware",        # HTTPS редиректы
    "django.contrib.sessions.middleware.SessionMiddleware",  # request.session
    "django.middleware.common.CommonMiddleware",             # trailing slash
    "django.middleware.csrf.CsrfViewMiddleware",             # CSRF проверка
    "django.contrib.auth.middleware.AuthenticationMiddleware", # request.user
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

Жизненный цикл запроса/ответа в Django

Обзор этапов

Каждый HTTP-запрос проходит строго определённую цепочку: WSGI-сервер → Django handler → middleware stack → URL resolver → view → middleware stack (обратно) → ответ клиенту.

1. WSGI/ASGI entry point

Gunicorn/Uvicorn получает HTTP-запрос и вызывает get_wsgi_application() или get_asgi_application(), которые возвращают WSGIHandler/ASGIHandler. Handler создаёт объект HttpRequest из environ-словаря.

3. URL Resolver

URLResolver сопоставляет request.path_info с паттернами из urls.py, используя regex или path-конвертеры. Если совпадение найдено — извлекаются kwargs для view. Если нет — Resolver404.

# urls.py
from django.urls import path, re_path
from . import views

urlpatterns = [
    path("users/<int:pk>/", views.UserDetailView.as_view(), name="user-detail"),
    re_path(r"^legacy/(?P<slug>[\w-]+)/$", views.LegacyView.as_view()),
]

4. View вызов

Django вызывает найденный view с (request, **kwargs). View должен вернуть HttpResponse (или подкласс). Функциональные view вызываются напрямую, CBV — через as_view(), который вызывает dispatch() → get()/post()/put() в зависимости от HTTP-метода.

from django.views import View
from django.http import JsonResponse

class UserDetailView(View):
    def dispatch(self, request, *args, **kwargs):
        # Вызывается до get/post — место для pre-обработки
        return super().dispatch(request, *args, **kwargs)

    def get(self, request, pk):
        from .models import User
        try:
            user = User.objects.get(pk=pk)
            return JsonResponse({"id": user.pk, "email": user.email})
        except User.DoesNotExist:
            from django.http import Http404
            raise Http404

5. Middleware: process_response

После получения ответа от view middleware применяются снизу вверх (в обратном порядке). Каждый middleware может модифицировать response (добавить заголовки, сжать тело) или заменить его полностью.

class TimingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        import time
        start = time.monotonic()

        response = self.get_response(request)  # вызов следующего middleware/view

        duration = time.monotonic() - start
        response["X-Request-Duration"] = f"{duration:.3f}s"
        return response

    def process_exception(self, request, exception):
        # Вызывается при необработанном исключении из view
        # Вернуть HttpResponse — перехватить, вернуть None — передать дальше
        import logging
        logging.error("Unhandled exception: %s", exception, exc_info=True)
        return None

6. Обработка исключений

Необработанные исключения из view перехватываются BaseHandler.handle_uncaught_exception. Http404 → 404 response (через handler404), PermissionDenied → 403, прочие → 500. При DEBUG=True Django рендерит debug-страницу с traceback.

Полная схема

# Псевдокод жизненного цикла
def wsgi_handler(environ, start_response):
    request = WSGIRequest(environ)

    # Middleware chain: сверху вниз
    for middleware in MIDDLEWARE:
        response = middleware.process_request(request)
        if response:  # short-circuit
            break
    else:
        # URL resolving
        callback, callback_args, callback_kwargs = resolver.resolve(request.path)
        # View
        try:
            response = callback(request, *callback_args, **callback_kwargs)
        except Exception as e:
            for middleware in reversed(MIDDLEWARE):
                response = middleware.process_exception(request, e)
                if response:
                    break
            else:
                response = handle_500(request)

    # Middleware chain: снизу вверх
    for middleware in reversed(MIDDLEWARE):
        response = middleware.process_response(request, response)

    return response

Подводные камни

  • Порядок middleware имеет значение — AuthenticationMiddleware должен идти после SessionMiddleware, иначе request.user не будет доступен.
  • process_view vs __call__ — старый стиль process_view вызывается перед view, но после URL-резолвинга; новый стиль middleware __call__ не имеет process_view автоматически — нужно переопределять явно.
  • Middleware возвращает response досрочно — middleware после него в цепочке не вызываются; если они добавляют критичные заголовки (CORS, HSTS), они будут пропущены.
  • CBV не вызывает process_exception middleware — исключения внутри dispatch() могут быть поглощены View.dispatch до того как middleware их увидит, если метод обёрнут в try-except.
  • Http404 в middleware — если middleware поднимает Http404, Django обработает его корректно только если это происходит в __call__, не в process_request старого стиля.
  • request.body и request.POST взаимоисключают — чтение request.body в middleware делает request.POST пустым в view, т.к. поток уже прочитан.

Типичные ошибки

  • Описывать request response lifecycle только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Django и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет request response lifecycle через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.
  • Умеет обсудить отказ, наблюдаемость и rollback без изменения публичного контракта.

Как вы знаете этот вопрос?

Проверить себя по теме Django →

Источники

  • https://docs.djangoproject.com/en/5.2/topics/http/middleware/
  • https://docs.djangoproject.com/en/5.2/ref/request-response/
←Предыдущий вопросКак организовать настройки, secrets и environment-specific config без утечек?Следующий вопрос→Что такое проблема N+1 запросов в Django и как её обнаружить и исправить?

Связанные темы

Djangoapi-designproduction-architecturetechnical-reasoning

Вакансии с этим навыком

  • Middle/Senior Full-Stack Python Engineer (Django) (#5841)
  • Senior Software Engineer (Backend) - C&C
  • Fullstack Developer (Python + Angular)
  • Python Developer
  • Senior Python Developer

Частые вопросы на собеседовании

  • Как Django защищает от SQL-инъекций, CSRF и XSS-атак?
  • Как организовать настройки, secrets и environment-specific config без утечек?
  • Что такое проблема N+1 запросов в Django и как её обнаружить и исправить?
  • В чём разница между select_related() и prefetch_related() и когда каждый из них применять?