2013-04-14 18 views
19

view.pyJak ograniczyć widok tylko do superużytkownika?

@login_required 
@permission_required('is_superuser') 
def score_reset(request): 
    pass 

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),  

Mam następujący kod i ku mojemu zdziwieniu nadal hit funkcję, mimo zalogowany z non administratora. Spodziewałem się, że odmówię zgody.

Czego mi brakuje?

Odpowiedz

33

is_superuser nie jest uprawnieniem, jest atrybutem w modelu użytkownika. Django ma już inny decorator you can make use of called user_passes_test aby wykonać ten test:

from django.contrib.auth.decorators import user_passes_test 

@user_passes_test(lambda u: u.is_superuser) 
def score_reset(self,...): 
    ... 
+0

btw, nie jestem oznakowanie to jako duplikat, ponieważ ani odpowiedzi Mam połączonej wspomnieć, że 'user_passes_test' jest istniejący dekorator Django, a także fakt, że' is_superuser 'nie jest zgodą. –

+2

Pytanie wymaga ograniczenia tylko dla superużytkownika. Przykładowy kod powinien być @user_passes_test (lambda u: u.is_superuser) – mhost

+0

Wykonanie 'user_passes_test' [powyższego fragmentu] wykonuje pracę. Ale możesz wziąć pod uwagę, że to przekieruje Cię na stronę logowania dla wszystkich nie-superużytkowników, nawet jeśli już się zalogowali. Może chcesz napisać własny dekorator, aby wykonać zadanie. – allsyed

1

@user_passes_test nie jest eleganckie rozwiązanie, jeśli chcesz wykonać ten test na wielu widoków. Możesz łatwo napisać swój własny dekorator, np. @staff_member_require.

Here widać jedno z możliwych rozwiązań.

0

Powyższe odpowiedzi wydają się być bardzo wczesnymi wersjami django. Są nieco skomplikowane, niż w przypadku późniejszej wersji:

dla django 1.11 jest nieco podobna, ale prostsza strategia.

views.py

from django.contrib.auth.decorators import login_required 

@login_required 
def some_view(request): 
if request.user.is_superuser: 
    //allow access only to superuser 
    return render(request, 'app/template1.html', args) 
else: 
    //allow access only to user 
    return render(request, 'app/template2.html', args) 
Powiązane problemy