2009-06-17 23 views
18

Sto provando a scrivere un decoratore "login_required" per le viste in un'applicazione WSGI + Werkzeug.Python - Ottieni gli argomenti della funzione originale nel decoratore

Per fare ciò, ho bisogno di accedere alla sessione dell'utente, che è accessibile tramite l'oggetto Richiesta che viene passato nei metodi di visualizzazione.

Non riesco a capire come ottenere quell'istanza di richiesta nel decoratore, però. Ho guardato PEP318, in particolare il quarto esempio, ma non riesco a capirlo.

Ecco quello che sto cercando:

def login_required(*args, **kw): 
    def goto_login(**kw): 
     return redirect(url_for('login')) 

    def decorate(f): 
     # args[0] should be request 
     args[0].client_session['test'] = True 
     logged_in = 0 
     if logged_in: 
      return f 
     else: 
      return goto_login 
    return decorate 


@login_required() 
@expose('/hello/<string:name>') 
def hello(request, name): 
    return render_template('say_hello.html', name=name) 

ma ottengo un indice di errore limiti cercando di chiamare args[0].

C'è un modo per accedere all'argomento della richiesta passato nella funzione "ciao" nel decoratore "login_required"?

risposta

23

Il decoratore login_required ha ricevuto la funzione (hello in questo caso).

Quindi, ciò che si vuole fare è:

def login_required(f): 
    # This function is what we "replace" hello with 
    def wrapper(*args, **kw): 
     args[0].client_session['test'] = True 
     logged_in = 0 
     if logged_in: 
      return f(*args, **kw) # Call hello 
     else: 
      return redirect(url_for('login')) 
    return wrapper 
+1

Perfetto! Stavo usando una sintassi diversa che è stata usata nel decoratore "expose" - non sono sicuro di aver compreso la sintassi alternativa. – ashgromnies

2

kwargs è un dizionario contenente argomento come chiavi e valori come valori.

Quindi tutto quello che dovete fare è controllare: some_var = kw['my_property']

Problemi correlati