← Назад к вопросам

Что такое redirect в Django?

2.7 Senior🔥 261 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Redirect в Django

Redirect — это механизм для перенаправления пользователя с одного URL на другой. В Django это реализуется через функцию redirect() из модуля django.shortcuts. Она отправляет HTTP-статус 302 (или 301 для постоянного перенаправления), который указывает браузеру загрузить новый URL.

Зачем нужны редиректы?

Основные использования:

  • Перенаправление после успешной отправки формы
  • Изменение URL без изменения контента (SEO оптимизация)
  • Перенаправление неавторизованных пользователей на страницу входа
  • Перенаправление с устаревших URL на новые
  • Логика бизнеса (например, редирект в зависимости от роли пользователя)

Как использовать redirect()

from django.shortcuts import redirect
from django.views import View
from django.http import HttpRequest, HttpResponse

# Вариант 1: redirect на абсолютный URL
def my_view(request: HttpRequest):
    return redirect("https://example.com")

# Вариант 2: redirect на путь
def my_view(request: HttpRequest):
    return redirect("/new-path/")

# Вариант 3: redirect на именованный URL (рекомендуется)
def my_view(request: HttpRequest):
    return redirect("home")  # где "home" — имя URL-паттерна

# Вариант 4: redirect с параметрами
def my_view(request: HttpRequest):
    return redirect("user-profile", user_id=123)

Практические примеры

Редирект после успешной отправки формы:

from django.shortcuts import render, redirect
from django.views import View
from .forms import UserForm

class RegisterView(View):
    def post(self, request):
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("login")  # Редирект на страницу входа
        return render(request, "register.html", {"form": form})

Защита от неавторизованного доступа:

from django.shortcuts import redirect
from functools import wraps
from django.http import HttpRequest

def login_required_custom(view_func):
    @wraps(view_func)
    def wrapper(request: HttpRequest, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect("login")  # Редирект на страницу входа
        return view_func(request, *args, **kwargs)
    return wrapper

@login_required_custom
def protected_view(request: HttpRequest):
    return HttpResponse("Это защищённое содержимое")

Редирект с сохранением параметров:

from django.shortcuts import redirect
from django.http import HttpRequest, HttpResponse

def search_view(request: HttpRequest):
    query = request.GET.get("q", "")
    page = request.GET.get("page", 1)
    # Выполняем поиск и редиректим с параметрами
    return redirect(f"/search/?q={query}&page={page}")

HTTP коды редиректа

from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect

# 302 — временное перенаправление (по умолчанию в redirect())
response = redirect("home")

# 301 — постоянное перенаправление (для SEO)
from django.views.decorators.http import require_http_methods
response = HttpResponsePermanentRedirect("/new-url/")

# или через параметр permanent
response = HttpResponseRedirect("/new-url/")

Важные детали

1. Отличие от render() и response():

  • render() — отправляет HTML-страницу с кодом 200
  • redirect() — отправляет код 302/301 и новый URL
  • HttpResponse() — отправляет произвольный контент

2. Редирект на reverse() для типобезопасности:

from django.urls import reverse
from django.shortcuts import redirect

# Вместо строки — используй reverse для получения URL по имени
return redirect(reverse("user-profile", args=[user_id]))

3. Цепочка редиректов — плохая практика:

# ❌ Плохо: редирект на редирект
def view1(request):
    return redirect("/path2/")

def view2(request):
    return redirect("/path3/")

Это увеличивает количество запросов и замедляет приложение.

Заключение

Redirect — это простой, но мощный инструмент для управления потоком пользователя в Django приложении. Используй redirect() для перенаправлений, reverse() для получения URL по имени, и помни о правильных HTTP кодах. Это критично для юзабилити и SEO оптимизации.

Что такое redirect в Django? | PrepBro