2013-08-19 82 views
2

我是相當新的燒瓶,我想使用裝飾器的migthy能力:p 我讀了很多東西,發現了大量關於python裝飾器的主題但沒有什麼真正有用的燒瓶裝飾器:無法傳遞參數從URL

@app.route('groups/<id_group>') 
@group_required(id_group) 
@login_required 
def groups_groupIndex(id_group): 
    #do some stuff 
    return render_template('index_group.html') 

這是錯誤我得到:

@group_required(id_group), NameError: name 'id_group' is not defined 

好吧,id_group沒有定義,但我不明白爲什麼我可以在功能groups_groupIndex使用id_group參數從URL,但不在裝修!

我嘗試移動/切換裝飾器,但每次都發生同樣的錯誤。

這裏是我的裝飾,但它似乎做工精細

def group_required(group_id): 
    def decorated(func): 
     @wraps(func) 
     def inner (*args, **kwargs): 
      #Core_usergroup : table to match users and groups 
      groups = Core_usergroup.query.filter_by(user_id = g.user.id).all() 
      for group in groups: 
       #if the current user is in the group : return func 
       if int(group.group_id) == int(group_id) : 
        return func(*args, **kwargs) 
      flash(gettext('You have no right on this group')) 
      return render_template('access_denied.html')  
     return inner 
    return decorated 

也許我沒有看到喜歡的裝飾我應該...我可以用我的裝飾這樣或需要我重新編寫不同的東西?

回答

9

您將group_id定義爲函數參數;這使其成爲該功能中的本地名稱。

這不會使該名稱可用於其他範圍;裝飾器所在的全局命名空間看不到那個名字。

包裝功能,但是,可以。它會被傳遞從@apps.route()包裝參數調用時:

def group_required(): 
    @wraps(func) 
    def wrapper(group_id, *args, **kwargs): 
     #Core_usergroup : table to match users and groups 
     groups = Core_usergroup.query.filter_by(user_id = g.user.id).all() 
     for group in groups: 
      #if the current user is in the group : return func 
      if int(group.group_id) == int(group_id) : 
       return func(*args, **kwargs) 
     flash(gettext('You have no right on this group')) 
     return render_template('access_denied.html')  
    return wrapper 
+0

我知道這是範圍問題,非常感謝,現在的作品完美:) –