Как в Django ограничить доступ к представлению (view) только для авторизованных пользователей?

Ответ

В Django для ограничения доступа к представлениям (views) используются два основных подхода в зависимости от типа представления:

  1. Для представлений-функций (FBV): Декоратор @login_required Декоратор применяется непосредственно к функции. Если пользователь не аутентифицирован, он будет перенаправлен на страницу входа.

    from django.contrib.auth.decorators import login_required
    from django.shortcuts import render
    
    @login_required
    def protected_view(request):
        # Логика, доступная только авторизованным пользователям
        return render(request, 'secret_template.html')
  2. Для представлений-классов (CBV): Миксин LoginRequiredMixin Миксин добавляется в список базовых классов представления. Он должен стоять перед основным классом представления (например, View или TemplateView).

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.views.generic import TemplateView
    
    class ProtectedView(LoginRequiredMixin, TemplateView):
        template_name = 'secret_template.html'

В обоих случаях, если пользователь не авторизован, Django перенаправит его на страницу входа. URL страницы входа по умолчанию — /accounts/login/, но его можно переопределить в файле settings.py с помощью параметра LOGIN_URL.

Ответ 18+ 🔞

А, ну вот, смотри, классическая дилемма — как отвадить всяких левых пидоров от твоего священного кода. В Django, блядь, два главных подхода, и они зависят от того, какую хуйню ты пишешь: функцию или класс.

  1. Если ты старомодный уёбок и любишь функции (FBV): Декоратор @login_required Всё просто, как три копейки. Нацепил декоратор на функцию — и всё, пиздец. Не авторизовался? Получи редирект на страницу логина и иди нахуй.

    from django.contrib.auth.decorators import login_required
    from django.shortcuts import render
    
    @login_required
    def protected_view(request):
        # Логика, доступная только авторизованным пользователям
        return render(request, 'secret_template.html')
  2. Если ты модный пидорок и юзаешь классы (CBV): Миксин LoginRequiredMixin Тут уже чуть хитрее, но тоже нихуя сложного. Подмешиваешь этот миксин в свой класс, и главное — поставь его ПЕРЕД основным классом вроде View, а то нихуя не сработает, ёпта!

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.views.generic import TemplateView
    
    class ProtectedView(LoginRequiredMixin, TemplateView):
        template_name = 'secret_template.html'

В обоих случаях, если какой-нибудь распиздяй без логина попробует зайти, Django его аккуратно, но настойчиво пошлёт на страницу входа. По умолчанию это /accounts/login/, но если тебе не нравится этот путь — ебашь в settings.py параметр LOGIN_URL и пропиши туда что душе угодно. Всё, вопрос закрыт, можно идти пить чай.