2013-05-04 66 views
2

裝飾工作正常,但如果用戶不屬於任何必需的組,我想顯示錯誤消息(我想使用消息框架)。這裏的裝飾:當裝飾失敗時顯示錯誤消息

def group_required(*group_names): 
    """Requires user membership in at least one of the groups passed in.""" 
    def in_groups(user): 
     if user.is_authenticated(): 
      if bool(user.groups.filter(name__in=group_names)) or user.is_superuser: 
       return True 
     return False 
    return user_passes_test(in_groups) 

我把它使用類似:

@require_http_methods(['GET'])  
@group_required('supervisor') 
def home_view(request): 
    return render(request, 'home.html') 

我用這個snippet使用消息框架(因爲這需要要求對象)的嘗試,但它認識到, 消息框架中間件未出現在裝飾器內部安裝。

我願意改變一切代價:)

更新:

我正在尋找:

def group_required(request, *group_names): 
    """Requires user membership in at least one of the groups passed in.""" 
    def in_groups(user): 
     if user.is_authenticated(): 
      if user.groups.filter(name__in=group_names).exists() or user.is_superuser: 
       return True 
      else: 
       # I'm getting: 
       # You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware 
       messages.add_message(request, messages.ERROR, 'Group is not allowed') 
     return False 
    return user_passes_test(in_groups, request) 
+0

我剛剛記錄了什麼請求包含,它不是請求對象。我認爲我的問題是將請求對象傳遞給裝飾器 – chachan 2013-05-05 14:27:20

回答

1

我不認爲你真的需要在此threadlocals用例。通常,當threadlocals似乎是在Django應用程序中使用的唯一方法時,可能會出現一些錯誤結構的上下文層。比較瓦特/ threadlocals,我寧願重複user_passes_test,然後修改它通過requestin_groups(我們不能夠通過requestis_group輕鬆而無需修改的user_passes_test代碼檢查問題:。How to pass Django request object in user_passes_test decorator callable function)(也許這個票?)

此外,bool(user.groups.filter(name__in=group_names))會造成項目決定的存在,使用exists()從而user.groups.filter(name__in=group_names).exists()直接返回從DB後端布爾結果之前被檢索到DB適配器和Python實例更爲高效這裏。

+0

感謝您的回答,我更改了查詢語句,看起來更好。關於消息問題,我做了替換,但我仍然得到「你不能添加消息,而不安裝django.contrib.messages.middleware.MessageMiddleware」,我有,但我想這是超出了它的上下文,任何想法如何在這一點上提供消息框架? – chachan 2013-05-04 18:09:50

+0

@chachan你重寫了user_passes_test嗎?你是如何解決在group_required中獲取請求對象的部分? – 2017-07-11 07:09:52

+0

@SandeepBalagopal對不起,我目前無法分辨,那是4年前 – chachan 2017-07-11 12:25:47

相關問題