Как в Django формируются HTTP-ответы?

«Как в Django формируются HTTP-ответы?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Django HTTP-ответы формируются с помощью экземпляров класса HttpResponse и его подклассов. Каждый view-обработчик должен возвращать такой объект.

Основные классы для ответов:

  1. HttpResponse Базовый класс для отправки текстового контента. Используется для возврата HTML, текста, XML и т.д.

    from django.http import HttpResponse
    
    def simple_view(request):
        return HttpResponse("Это простой текстовый ответ.", content_type="text/plain")
  2. JsonResponse Специализированный подкласс для API. Автоматически сериализует Python-словари в JSON и устанавливает заголовок Content-Type: application/json.

    from django.http import JsonResponse
    
    def api_view(request):
        data = {'status': 'ok', 'data': [1, 2, 3]}
        return JsonResponse(data)
  3. HttpResponseRedirect Используется для перенаправления пользователя на другой URL. Обычно создается с помощью шортката redirect().

    from django.shortcuts import redirect
    
    def redirect_view(request):
        # Возвращает ответ с кодом 302 Found
        return redirect('/new-location/')
  4. TemplateResponse Ответ, рендеринг которого отложен. Это позволяет middleware-компонентам изменять контекст шаблона уже после того, как view его вернул, но до отправки клиенту.

    from django.template.response import TemplateResponse
    
    def template_view(request):
        context = {'user': request.user}
        return TemplateResponse(request, 'profile.html', context)

Кастомизация ответа

Любой объект ответа можно кастомизировать, изменяя его атрибуты, например, код состояния или заголовки:

response = HttpResponse("Страница не найдена", status=404)
response.headers['X-Custom-Header'] = 'MyValue'