Класс HttpRequest

Класс HttpRequest создается автоматически Django для каждого входящего запроса и передается в качестве первого аргумента в каждую функцию представления. Объект запроса содержит все данные о клиентском запросе: HTTP-метод, путь, заголовки, параметры GET, данные POST, загруженные файлы и cookies. Атрибуты и методы этого класса позволяют удобно получать информацию о запросе и управлять сессиями пользователя.

Основные атрибуты

Объект HttpRequest предоставляет следующие ключевые атрибуты:

pythonrequest.method     # HTTP-метод: GET, POST, PUT, DELETE и др.
request.path     # Путь запроса без домена и параметров
request.GET      # QueryDict с GET-параметрами
request.POST     # QueryDict с POST-данными
request.COOKIES    # Словарь с cookies
request.FILES    # Данные загруженных файлов
request.META     # Словарь с заголовками и метаданными
request.session    # Объект сессии
request.user     # Текущий пользователь
request.headers    # Объект заголовков запроса
request.body     # Сырое тело запроса в байтах

Пример . Для GET-запроса

Рассмотрим пример обработки GET-запроса с параметрами:

pythonfrom django.http import HttpResponse

def search_view(request):
  # Получаем параметр search из строки запроса
  query = request.GET.get('search', '')

  # Получаем параметр page с значением по умолчанию
  page = request.GET.get('page', 1)

  # Проверяем метод запроса
  if request.method == 'GET':
    return HttpResponse(f"Search: {query}, Page: {page}")

Результат выполнения при запросе "/search/?search=django&page=2":

python"Search: django, Page: 2"

Пример . Для POST-запроса

Обработка данных из формы, отправленной методом POST:

pythonfrom django.http import HttpResponse

def login_view(request):
  if request.method == 'POST':
    # Получаем данные из POST-запроса
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')

    # Проверка данных пользователя
    if username == 'admin' and password == 'secret':
      return HttpResponse("Login successful")

    return HttpResponse("Invalid credentials")

Работа с заголовками

Доступ к заголовкам запроса через атрибуты META и headers:

pythonfrom django.http import HttpResponse

def headers_view(request):
  # Получение заголовков через META (с префиксом HTTP_)
  user_agent = request.META.get('HTTP_USER_AGENT', 'Unknown')
  referer = request.META.get('HTTP_REFERER', '')

  # Современный способ через headers
  accept_language = request.headers.get('Accept-Language', 'en')

  # IP-адрес клиента
  remote_ip = request.META.get('REMOTE_ADDR', 'Unknown')

  return HttpResponse(
    f"User-Agent: {user_agent}\n"
    f"Referer: {referer}\n"
    f"Accept-Language: {accept_language}\n"
    f"IP: {remote_ip}"
  )

Проверка безопасности

Метод is_secure позволяет определить, используется ли защищенное соединение HTTPS:

pythonfrom django.http import HttpResponse

def secure_view(request):
  if request.is_secure():
    return HttpResponse("Secure HTTPS connection")

  return HttpResponse("Insecure HTTP connection")

Построение полного URL

Метод build_absolute_uri создает абсолютный URL относительно текущего запроса:

pythonfrom django.http import HttpResponse

def url_view(request):
  # Полный URL текущей страницы
  full_url = request.build_absolute_uri()

  # Полный URL с относительным путем
  profile_url = request.build_absolute_uri('/profile/')

  # Полный путь с параметрами
  full_path = request.get_full_path()

  return HttpResponse(
    f"Full URL: {full_url}\n"
    f"Profile URL: {profile_url}\n"
    f"Full path: {full_path}"
  )

Результат выполнения для запроса на "/articles/?page=1":

python"Full URL: http://example.com/articles/?page=1"
"Profile URL: http://example.com/profile/"
"Full path: /articles/?page=1"

Работа с файлами

Обработка загруженных файлов через атрибут FILES:

pythonfrom django.http import HttpResponse

def upload_view(request):
  if request.method == 'POST' and request.FILES:
    # Получаем загруженный файл
    uploaded_file = request.FILES.get('file')

    if uploaded_file:
      # Читаем содержимое файла
      content = uploaded_file.read()
      file_name = uploaded_file.name
      file_size = uploaded_file.size

      # Проверяем тип файла
      if uploaded_file.content_type == 'text/plain':
        return HttpResponse(
          f"File {file_name} uploaded successfully. "
          f"Size: {file_size} bytes."
        )

  return HttpResponse("No file uploaded")

Получение полного пути

Метод get_full_path возвращает путь запроса вместе со строкой параметров:

pythonfrom django.http import HttpResponse

def path_view(request):
  # Путь с параметрами
  full_path = request.get_full_path()

  # Путь без параметров
  path_only = request.path

  return HttpResponse(
    f"Full path: {full_path}\n"
    f"Path only: {path_only}"
  )

Результат выполнения для запроса "/blog/?category=python&author=john":

python"Full path: /blog/?category=python&author=john"
"Path only: /blog/"

Смотрите также

  • класс HttpResponse,
    который используется для формирования ответа
  • класс QueryDict,
    который используется для хранения параметров запроса
  • атрибут GET,
    который содержит GET-параметры запроса
  • атрибут POST,
    который содержит POST-параметры запроса