2013-07-05 42 views
3

這一直讓我發瘋,因爲它應該是如此簡單,但是我一定會有一些Python怪癖。我有一個裝飾器,我試圖應用於Flask路由,但由於某種原因,我的views.py中的裝飾器似乎沒有被加載。函數裝飾器未被調用

decorators.py

def admin_required(func): 
    """Require App Engine admin credentials.""" 
    @wraps(func) 
    def decorated_view(*args, **kwargs): 
     if users.get_current_user(): 
      if not users.is_current_user_admin(): 
       abort(401) # Unauthorized 
      return func(*args, **kwargs) 
     return redirect(users.create_login_url(request.url)) 
    return decorated_view 

views.py

@admin_required 
@blueprint.route('/') 
def index(): 
    return render_template('index.html') 

admin_required裝飾功能不會被調用(index.html的加載沒有重定向),並且我不能找出原因。

回答

4

簡短的回答:改變裝飾者的順序; blueprint.route只「看到」你的未修飾功能。

裝飾器內部應用,與功能調用類似。因此,你的函數定義等同於:

def index(): 
    return render_template('index.html') 
index = blueprint.route('/')(index) 
index = admin_required(index) 

注意如何blueprint.route傳遞的index函數之前它被通過admin_required包裹。當然,admin_required確實最終會應用於模塊中的index名稱,所以如果您直接致電請撥index,它會經過兩個裝飾器。但是你不是直接調用它,而是告訴flask的請求處理器調用它。

+0

謝謝,我覺得這很簡單(雖然我有點尷尬,我沒有嘗試過)。 –