Для отправки ответа клиенту в Django применяется класс HttpResponse из пакета django.http. В общем случае для отправки некоторых данных достаточно эти данные передать в конструктор HttpResponse. Например, пусть в файле views.py имеется простейшая функция-представление, которая отправляет ответ клиенту:
from django.http import HttpResponse def index(request): return HttpResponse("Hello")
И в файле urls.py эта функция соотносится с некоторым маршрутом:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), ]
Подобная функция просто передает в HttpResponse некоторый текст, который пользователь затем увидит в браузере. Однако подобной функциональностью HttpResponse не ограничивается. Так, функция инициализации класса определяет несколько параметров:
HttpResponse.__init__(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)
Параметры:
content: содержимое ответа в виде строки байтов. Если передается другое содержимое, то оно конвертируется в строку байтов
content_type: MIME-тип ответа, устанавливает HTTP-заголовок Content-Type
. Если
этот параметр не установлен, то применяется mime-тип text/html
и значение настройки DEFAULT_CHARSET, то есть в итоге будет: "text/html; charset=utf-8"
.
charset: кодировка ответа в виде строки. По умолчанию django пытается установить кодировку из параметра content_type, а в случае неудачи для установки кодировки
применяется настройка DEFAULT_CHARSET
.
status: статусный код ответа. По умолчанию равно 200
reason_phrase: сообщение, которое отправляется в вместе статусным кодом
headers: заголовки ответа в виде словаря
Для хранения отправляемых данных он определяет ряд атрибутов. Некоторые из них:
content: содержимое ответа в виде строки байтов
headers: отправляемые заголовки в виде словаря
charset: кодировка ответа в виде строки. По умолчанию django пытается установить кодировку из заголовка content_type, а в случае неудачи для установки кодировки
применяется настройка DEFAULT_CHARSET
.
status_code: статусный код ответа
reason_phrase: сообщение, которое отправляется в вместе статусным кодом
Рассмотрим некоторые возможности. Например, изменим определение функции в файле views.py:
from django.http import HttpResponse def index(request): return HttpResponse("Hello METANIT.COM", headers={"SecretCode": "21234567"})
В данном случае также устанавливается заголовок "SecretCode". Хотя в реальности в HTTP не существует такого заголовка, но мы можем определять кастомные заголовки, чтобы передать через них клиенту какую-нибудь информацию. Например, после обращения к функции мы можем в браузере через инструменты разработчика проинспектировать отправленные сервером заголовки и найти там в том числе заголовок "SecretCode".
Подобным образом можно установить другие параметры, например, статусный код и сообщение к нему:
from django.http import HttpResponse def index(request): return HttpResponse("Произошла ошибка", status=400, reason="Incorrect data")
Установка содержимого и кодировки:
from django.http import HttpResponse def index(request): return HttpResponse("<h1>Hello</h1>", content_type="text/plain", charset="utf-8")
Хотя в содержимом ответа применяются теги html (<h1>
), но браузере теперь будет рассматривать
это содержимое как простой текст, потому что установлен заголовок "text/plain":