#python #django #decorator #mixins
#python #django #декоратор #смешивания
Вопрос:
Я попытался преобразовать декоратор cutoms из функции в класс Mixin, потому что я использую CVB, и я хотел наследовать от этого Mixin для проверки статуса пользователей для некоторых страниц. У меня есть этот декоратор, который проверяет, аутентифицирован ли пользователь или нет, если пользователь аутентифицирован и пытается получить доступ к странице, на которой есть этот декоратор, он будет перенаправлен на панель инструментов, если нет, тогда il будет иметь доступ к странице доступа. Я написал этот класс как версию класса декоратора, и если пользователь вошел в систему, он работает нормально, но если это не так, и он пытается получить доступ к этой странице, это выдает мне эту ошибку:
При неправильной настройке в /auth/login/ UserLoginView отсутствует атрибут permission_required. Определите UserLoginView.permission_required или переопределите UserLoginView.get_permission_required() .
это декоратор:
def is_authenticated(view_func):
def wrapper_func(request, *args, **kwargs):
if request.user.is_authenticated:
return redirect('dashboard')
else:
return view_func(request, *args, **kwargs)
return wrapper_func
версия класса:
class IsAuthenticatedMixin(PermissionRequiredMixin):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
return redirect('dashboard')
return super().dispatch(request, *args, **kwargs)
представления, которые наследуют этот микс
class IndexFormView(IsAuthenticatedMixin, CreateView):
permission_required = 'view'
template_name = 'home/index.html'
form_class = NewsletterForm
def post(self, request, *args, **kwargs):
email = request.POST['email']
if Newsletter.objects.filter(email=email).exists():
messages.warning(
request, 'This email is already subscribed in our system')
else:
Newsletter.objects.create(
email=email)
messages.success(request,
'Your email was subscribed in our system, you'll hear from us as soon as possible !')
return super().post(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['testimonials'] = Testimonial.objects.order_by('-created_date')[:9]
return context
class AboutTemplateView(IsAuthenticatedMixin, TemplateView):
template_name = 'home/about.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['banner_page_title'] = 'About Us'
context['page_location'] = 'home / about'
return context
class UserResgistrationCreateView(IsAuthenticatedMixin, CreateView):
template_name = 'home/auth/register.html'
form_class = UserRegistrationForm
success_url = reverse_lazy('login')
class UserLoginView(IsAuthenticatedMixin, LoginView):
template_name = 'home/auth/login.html'
Ответ №1:
Причина, по которой это происходит, заключается в том, что вы создаете подкласс из PermissionRequiredMixin
[Django-doc], это означает, что во всех представлениях, которые вы используете IsAuthenticatedMixin
, вам необходимо указать permission_required
атрибут класса. Ошибка здесь связана с UserLoginView
:
class UserLoginView(IsAuthenticatedMixin, LoginView):
template_name = 'home/auth/login.html'
permission_required = …
где вам, таким образом, необходимо ввести значение для …
. Но та же проблема будет возникать и в других представлениях на основе классов, из которых вы выполняете подкассу IsAuthenticatedMixin
, и для которых вы не указываете значение permission_required
.
Однако именно поэтому вы пишете здесь пользовательский микс. То, что вы делаете, реализовано с помощью LoginRequiredMixin
[Django-doc]. Единственное, что отличается, это URL-адрес перенаправления, но вы можете указать это:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
class IsAuthenticatedMixin(LoginRequiredMixin):
login_url = reverse_lazy('dashboard')
redirect_field_name = None
В представлении, где вам нужно использовать разрешение, вы также можете подклассировать PermissionRequiredMixin
:
from django.contrib.auth.mixins import PermissionRequiredMixin
class IndexFormView(IsAuthenticatedMixin, PermissionRequiredMixin, CreateView):
permission_required = 'view'
template_name = 'home/index.html'
form_class = NewsletterForm
Комментарии:
1. Большое спасибо, это очень полезная информация. Я изменю свой миксин и протестирую его !!