2010-12-01 15 views
3

Hier ist meine Ansicht. Im Grunde gibt es unterschiedliche Antworten basierend darauf, ob es angemeldet ist oder nicht.Wie schreibe ich einen Dekorator für meine Django/Python-Ansicht?

@check_login() 
def home(request): 
    if is_logged_in(request): 
     return x 
    else: 
     return y 

Hier ist mein Dekorateur-Code. Ich will nur überprüfen, ob der Request-Header hat, und wenn ja, melden Sie ihn.

#decorator to log the user in if there are headers 
def check_login(): 
    def check_dec(func): 
     if request.META['username'] == "blah": 
      login(request, user) 

    return check_dec 

Das Problem is..I nicht wissen, wie man eine richtige Dekorateur in diesem Fall schreiben !!! Was sind die Argumente? Was sind die Funktionen? Wie?

Antwort

11

Verwenden Sie nur @check_login statt check_login() bekommen - sonst Ihr Dekorateur muss ein Dekor zurückgeben, wie Sie es tun home = check_login()(home)

Hier ist ein Beispiel Dekorateur:

def check_login(method): 
    @functools.wraps(method) 
    def wrapper(request, *args, **kwargs): 
     if request.META['username'] == "blah" 
      login(request, user) # where does user come from?! 
     return method(request, *args, **kwargs) 
    return wrapper 

Dieser Dekorateur Ihre Login-Funktion ausführen aufrufen wird, wenn der Benutzername Feld ist auf „blah“ und dann die ursprüngliche Methode aufrufen.

3

Ein Plain Decorator ist einfach eine Funktion, die eine Funktion oder Klasse übernimmt und etwas anderes zurückgibt (normalerweise den gleichen Typ, aber das ist nicht erforderlich). Ein parametrisierter Dekorator ist eine Funktion, die einen Dekorator zurückgibt.

Also, in diesem Sinne schaffen wir eine Schließung aus und senden es:

def check_login(func): 
    def inner(request, *args, **kwargs): 
    if request.META['username'] == 'blah': 
     login(request, user) # I have no idea where user comes from 
    func(request, *args, **kwargs) 
    return inner 
+0

Sie können den Benutzer von der Anfrage abrufen: 'request.user' –

2

hier ein Dekorateur ist ich zu überprüfen geschrieben, wenn der Benutzer in einer bestimmten Gruppe ist. Es zeigt ein bisschen mehr.

https://github.com/mzupan/django-decorators/blob/master/auth.py

Sie verwenden es wie

@group_required(["group1", "group2"]) 
def show_index(request): 
    view_code_here 

Der Benutzer entweder in Gruppe 1 oder Gruppe 2 sein können, wenn sie nicht, dass sie eine 404-Seite

Verwandte Themen