2009-06-17 12 views
18

Bir WSGI + Werkzeug uygulamasında görünümler için "login_required" bir dekoratör yazmaya çalışıyorum.Python - Özgün işlev argümanlarını dekoratörde alın

Bunu yapmak için, görüntüleme yöntemine iletilen Request nesnesine erişilebilen kullanıcının oturumuna erişmem gerekiyor.

Dekoratördeki Request örneğine nasıl ulaşılacağını anlayamıyorum. PEP318'e, özellikle de dördüncü örneğe baktım ama tam anlamıyorum.

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) 

ama args[0] aramaya çalışıyorum sınırları hata dışına bir dizin olsun:

İşte çalıştığım şey.

"login_required" dekoratöründe "merhaba" işlevine iletilen istek değişkenine erişebilmemin herhangi bir yolu var mı?

cevap

23

Dekoratör login_required işlevi (bu durumda hello) işlevinden geçti.

Yani yapmak istediğim şey:

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

Mükemmel:

Yani yapmanız gereken çek! "Expose" dekoratöründe kullanılan farklı bir sözdizimi kullanıyordum - alternatif sözdizimini anladığımdan emin değilim. – ashgromnies

2

kwargs değerler olarak anahtarlar ve değerler olarak argüman içeren sözlüktür. some_var = kw['my_property']

İlgili konular