django PermissionRequiredMixin Разрешение_required не работает - PullRequest
0 голосов
/ 02 марта 2019

Views.py

class templateList(PermissionRequiredMixin, TemplateView):
    permission_required = 'accounts.template_all'

    def get(self, request, *args, **kwargs):
        #view logic
        print(self.request.user.has_perms('accounts.template_all'))
        return render(request, template_name, context)

account / models.py

class User(AbstractBaseUser, PermissionsMixin):
    # some fields here
    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

        permissions = (
            ("template_all", "access to all templates"),
        )

ViewName .___ mro ____

(<class 'template.views.templateList'>, <class 'django.contrib.auth.mixins.PermissionRequiredMixin'>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'django.views.generic.base.TemplateView'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class 'django.views.generic.base.View'>, <class 'object'>)

self.request.user.has_perms('accounts.template_all') в views.py возвращаетправильное логическое значение, однако, self.has_permission() возвращает True каждый раз.permission_required не имеет никакого эффекта, и пользователь все еще может видеть страницу, даже когда печать возвращает false.self.get_permission_required alos возвращает правильное значение.Помощь оценена.

1 Ответ

0 голосов
/ 02 марта 2019

Короче говоря : базовый класс PermissionRequiredMixin должен быть размещен перед базовым классом TemplateView, так, чтобы MRO был правильным, и отправка указывает на переопределение PermissionRequiredMixin.

A PermissionRequiredMixin исправляет метод dispatch(..) (хорошо, он добавляет дополнительную проверку, которая проверяет, есть ли у пользователя соответствующие разрешения).Здесь, однако, вы разместили подклассы в порядке, который приводит к тому, что функция dispatch(..) является той из класса View.

Действительно, если мы посмотрим на MRO, мы увидим:

>>> ViewName.__mro__
(<class 'ViewName'>, <class 'django.views.generic.base.TemplateView'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class <b>'django.views.generic.base.View'</b>>, <class <b>'django.contrib.auth.mixins.PermissionRequiredMixin'</b>>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'object'>)

и если мы посмотрим на метод, который вызывается при вызове .dispatch(..), мы увидим:

>>> ViewName.dispatch
<function View.dispatch at 0x7f169e8f6620>

, чтобы позволить mixin переопределить оригинал.dispatch(..) функция, нам нужно поместить ее сначала в базовые классы, например:

# PermissionRequiredMixin is put <i>before</i> TemplateView

class ViewName(<b>PermissionRequiredMixin, TemplateView</b>):
    permission_required = 'accounts.action_all'
    # ...

Затем мы видим, что:

>>> ViewName.__mro__
(<class 'ViewName'>, <class <b>'django.contrib.auth.mixins.PermissionRequiredMixin'</b>>, <class 'django.contrib.auth.mixins.AccessMixin'>, <class 'django.views.generic.base.TemplateView'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class <b>'django.views.generic.base.View'</b>>, <class 'object'>)
>>> ViewName.dispatch
<function <b>PermissionRequiredMixin.dispatch</b> at 0x7f168b41d620>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...