Перенаправление неавторизованного пользователя на страницу входа (для всех представлений)
Я хочу перенаправить пользователя на страницу 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)