2009-06-17 2 views
18

WSGI + Werkzeug 애플리케이션의 뷰에 "login_required"데코레이터를 쓰려고합니다.파이썬 - 데코레이터의 원래 함수 인수 얻기

이렇게하려면 뷰 메서드에 전달되는 Request 개체를 통해 액세스 할 수있는 사용자 세션에 있어야합니다.

데코레이터에서 Request의 해당 인스턴스를 가져 오는 방법을 알 수는 없습니다. PEP318, 특히 네 번째 예제를 살펴 보았지만, 아직 제대로 이해하지 못했습니다.

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) 

하지만 args[0]를 호출하려고 경계 오류에서 인덱스를 얻을 :

는 여기에 내가 노력하고있어입니다.

"login_required"데코레이터의 "hello"기능에 전달 된 요청 인수에 액세스 할 수있는 방법이 있습니까?

답변

23

데코레이터 login_required에 전달됩니다 (이 경우 hello).

그래서 당신이 원하는 무엇인가 :

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

완벽한 :

그래서 당신이해야 할 모든 체크입니다! 나는 "노출"데코레이터에서 사용 된 다른 구문을 사용하고있었습니다. 대체 구문을 이해할 수 있는지 잘 모르겠습니다. – ashgromnies

2

kwargs 값으로 키와 값으로 인수를 포함하는 사전입니다. some_var = kw['my_property']