декоратор permission_required, не работающий на меня

Если мои планы удадутся, то мы будем все использовать Схему через 5 лет с этого времени!; p

6
задан Mitch 13 August 2009 в 00:31
поделиться

3 ответа

permission_required () необходимо передать имя разрешения, а не выражение Python в строке. Попробуйте вместо этого:

from contrib.auth.decorators import user_passes_test
def staff_required(login_url=None):
    return user_passes_test(lambda u: u.is_staff, login_url=login_url)

@staff_required(login_url="../admin")
def series_info(request)
...

Спасибо. Это действительно работает. У тебя есть пример того, как использовать permission_required? Из документация docs.djangoproject.com/en/1.0/… и djangobook.com/en/2.0/chapter14 I подумал, что то, что у меня было, должно сработать.

Перечитайте размещенные вами ссылки; permission_required () проверяет, предоставлено ли пользователю конкретное разрешение. Он не проверяет атрибуты объекта пользователя.

Из http://www.djangobook.com/en/2.0/chapter14/ :

def vote(request):
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote'):
        # vote here
    else:
        return HttpResponse("You can't vote in this poll.")

   #
   #
 # # #
  ###
   #

def user_can_vote(user):
    return user.is_authenticated() and user.has_perm("polls.can_vote")

@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
    # vote here

   #
   #
 # # #
  ###
   #

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url="/login/")
def vote(request):
    # vote here
22
ответ дан 8 December 2019 в 03:54
поделиться

Вот пример поведения, которого я не понимаю. Я создаю пользователя, запрашиваю и украшаю тестовую функцию с помощью проверки permission_required на is_staff. Если пользователь является суперпользователем, доступ предоставляется к тестовой функции. Если у пользователя только is_staff = True, доступ не предоставляется.

from django.http import HttpRequest
from django.contrib.auth.models import User
from django.contrib.auth.decorators import permission_required

@permission_required('is_staff')
def test(dummy='dummy'):
    print 'In test'

mb_user = User.objects.create_user('mitch', 'mb@home.com', 'mbpassword')
mb_user.is_staff = True

req = HttpRequest()
req.user = mb_user

test(req) # access to test denied - redirected

req.user.is_staff = False

test(req) # same as when is_staff is True

req.user.is_superuser = True
test(req) # access to test allowed
1
ответ дан 8 December 2019 в 03:54
поделиться

Я бы сделал это следующим образом:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def series_info(request):
    ...

В документации говорится о staff_member_required:

Декоратор для представлений, который проверяет, что пользователь вошел в систему и является ли он сотрудником, при необходимости отображая страницу входа.

3
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: