Перенаправление неавторизованного пользователя на страницу входа (для всех представлений)

Я хочу перенаправить пользователя на страницу login, если он не вошел в систему.

Изначально я посмотрел на декоратор @login_required(login_url='/accounts/login/').

Но это не идеально, по двум причинам: во-первых, я хочу, чтобы это применялось ко всем представлениям. Также декоратор возвращает сообщение об ошибке, когда я пытаюсь войти в систему с помощью allauth.

Я уверен, что это решаемо, но я ищу решение, которое можно применить ко всем взглядам.

Я нашел кое-что, используя authmiddleware (doc: https://pypi.org/project/django-authmiddleware/). Однако код, похоже, не реагирует, в том смысле, что ничего не происходит и логи в консоли, похоже, ничего не фиксируют

Может ли кто-нибудь понять, что я делаю неправильно?

base.py

MIDDLEWARE = [

    'django.contrib.sessions.middleware.SessionMiddleware',

    'AuthMiddleware.middleware.AuthRequiredMiddleware', 
]
AUTH_SETTINGS = {

    "LOGIN_URL" : "login_user",
    "DEFAULT_REDIRECT_URL" : None,
    "REDIRECT_AFTER_LOGIN" : False,

}

views.py

from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.urls import reverse

class AuthRequiredMiddleware(object):
    def process_request(self, request):
        if not request.user.is_authenticated():
            return HttpResponseRedirect(reverse('login_user'))
        return None 

почему бы не использовать 'return redirect('%s?next=%s' % (settings.login_user, request.path))' вместо HttpResponse

Нашел альтернативное решение и решил оставить его здесь.

Я использовал учебник на youtube (https://www.youtube.com/watch?v=axsaC62UQOc), который, с некоторыми изменениями (видео старое), работает как шарм. Это около 3 видео по 30 минут, очень хорошо объяснено.

Вот так:

settings.py

MIDDLEWARE = [

    '[yourappname].middleware.LoginRequiredMiddleware', 
]

LOGIN_EXEMPT_URLS =( #<-- I am using allauth, so left some examples here)
    r'logout',
    r'register_user',
    r'accounts/google/login/',
    r'accounts/social/signup/',
    r'accounts/facebook/login/',
    
)

middleware.py (этот файл находится в вашем основном приложении, по умолчанию "mysite")

import re
from django.conf import settings
from django.shortcuts import redirect

EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware:
    pass
    def __init__(self, get_response):
        self.get_response = get_response
        
    def __call__ (self, request):
        response = self.get_response(request)
        return response
    
    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request,'user')
        path = request.path_info.lstrip('/')
        print(path)
        
        if not request.user.is_authenticated:
            if not any(url.match(path) for url in EXEMPT_URLS):
                return redirect(settings.LOGIN_URL)
    
Вернуться на верх