2012-01-09 45 views
0

我想爲我的Django視圖創建一個裝飾器,以確保某些數據片段在我的會話中。如果他們在那裏,你可以看到視圖,如果他們不在那裏,你會被重定向到插入到會話中的另一個視圖。需要幫助創建一個裝飾器來強制存在會話數據

我很納悶:

  1. 使用裝飾正確的方法,或者我應該利用中間件...
  2. 有人可以提供一個例子嗎?

感謝

回答

0

裝飾器無疑是最有意義的,我認爲。查看@login_required裝修廠商的代碼:

def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME): 
    """ 
    Decorator for views that checks that the user passes the given test, 
    redirecting to the log-in page if necessary. The test should be a callable 
    that takes the user object and returns True if the user passes. 
    """ 

    def decorator(view_func): 
     @wraps(view_func, assigned=available_attrs(view_func)) 
     def _wrapped_view(request, *args, **kwargs): 
      if test_func(request.user): 
       return view_func(request, *args, **kwargs) 
      path = request.build_absolute_uri() 
      # If the login url is the same scheme and net location then just 
      # use the path as the "next" url. 
      login_scheme, login_netloc = urlparse.urlparse(login_url or 
                 settings.LOGIN_URL)[:2] 
      current_scheme, current_netloc = urlparse.urlparse(path)[:2] 
      if ((not login_scheme or login_scheme == current_scheme) and 
       (not login_netloc or login_netloc == current_netloc)): 
       path = request.get_full_path() 
      from django.contrib.auth.views import redirect_to_login 
      return redirect_to_login(path, login_url, redirect_field_name) 
     return _wrapped_view 
    return decorator 


def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None): 
    """ 
    Decorator for views that checks that the user is logged in, redirecting 
    to the log-in page if necessary. 
    """ 
    actual_decorator = user_passes_test(
     lambda u: u.is_authenticated(), 
     login_url=login_url, 
     redirect_field_name=redirect_field_name 
    ) 
    if function: 
     return actual_decorator(function) 
    return actual_decorator