2011-07-06 68 views
0

我有以下看法功能:添加調度裝飾

def gettingstarted_info(request): 
    """ 
    First page of gettingstarted after Registration. 
    """ 
    if request.user.is_authenticated(): 
     if request.user.get_profile().getting_started_boolean: 
      return redirect('/home/')      
     else: 
      user = request.user 
    else: 
     username = request.session.get('username', False)             
     if not username: 
      return redirect('/login')     
     else: 
      user = User.objects.get(email=username) 
    # the main part of the view function # 

我想查看功能的第一部分轉換爲@裝飾,這樣我就可以有這樣的事情 -

@gettingstarted_dispatch 
def getting_started_info(request): 
    # the main part of the view function 

我看了一下關於裝飾器功能的文檔,但在轉換函數時遇到了一些困難,所以我可以使用它作爲@裝飾器。裝飾者應該過濾未經授權的個人並返回user變量(注意這與request.user不一樣)。我將如何做到這一點?謝謝。

回答

1

我認爲這個函數應該爲你做竅門。 :)

def gettingstarted_dispatch(f): 
    def wrap(request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      if request.user.get_profile().getting_started_boolean: 
       return redirect('/home/') 
      else: 
       user = request.user 
     else: 
      username = request.session.get('username', False) 
      if not username: 
       return redirect('/login') 
      else: 
       user = User.objects.get(email=username) 
     kwargs['user'] = user 
     return f(request, *args, **kwargs) 
    return wrap 

函數將用戶變量作爲user關鍵字ARG。

另外,如果你願意,用戶視爲第二個參數...

  else: 
       user = User.objects.get(email=username) 
     return f(request, user, *args, **kwargs) 
    return wrap 

而且,這裏是關於如何做裝飾深入的教程真的很好。 :)

(第一部分)http://www.artima.com/weblogs/viewpost.jsp?thread=240808
(第二部分)http://www.artima.com/weblogs/viewpost.jsp?thread=240845
(第三部分)http://www.artima.com/weblogs/viewpost.jsp?thread=241209

+0

感謝,超級有用的,無論是代碼和聯繫! – David542