2013-04-14 7 views
19

view.pyWie schränkt man eine Ansicht auf Superuser ein?

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

url.py

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

Ich habe den folgenden Code und zu meiner Überraschung traf ich immer noch die Funktion, obwohl sie mit einem nicht Superuser angemeldet. Ich habe erwartet, dass eine Genehmigung verweigert wird.

Was fehlt mir?

Antwort

33

is_superuser ist keine Erlaubnis, es ist ein Attribut auf dem Benutzermodell. Django hat bereits eine andere decorator you can make use of called user_passes_test diese Prüfung durchführen:

from django.contrib.auth.decorators import user_passes_test 

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

btw, ich bin diese Kennzeichnung nicht als Duplikat da weder Antwort, die ich verbunden habe zu erwähnen, dass 'user_passes_test' ist eine bestehende django Dekorateur sowie die Tatsache, dass' is_superuser 'ist keine Erlaubnis –

+2

Die Frage fragt nach der Beschränkung auf Superuser nur. Der Beispielcode sollte @user_passes_test sein (lambda u: u.is_superuser) – mhost

+0

Mit 'user_passes_test' [das obige Snippet] funktioniert das. Aber du solltest vielleicht bedenken, dass dies zur Login-Seite für alle Nicht-Super-User umgeleitet wird, Selbst wenn sie sich bereits eingeloggt haben. Vielleicht möchten Sie Ihren eigenen Dekorateur schreiben, um die Arbeit zu erledigen. – allsyed

1

@user_passes_test ist keine elegante Lösung, wenn Sie diese Prüfung auf viele Ansichten ausführen möchten. Sie können einfach Ihren eigenen Dekorator schreiben, der zum Beispiel @staff_member_require hat.

Here können Sie eine der möglichen Lösungen sehen.

0

Die obigen Antworten scheinen für sehr frühe Versionen von django zu sein. Sie sind etwas komplizierter als für die spätere Version

für Django 1.11 ist hier ein bisschen ähnlich, aber einfachere Strategie.

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) 
Verwandte Themen