2012-09-12 19 views
0

我有一个装饰问题。我试图用可选参数编​​写我自己的装饰器。我的什么问题?

这是它现在怎么做:

def CheckPremissions(manager=1): 
    def wrap(func): 
     def wrapper(request, *args, **kwargs): 
      if request.user.is_anonymous(): 
       return HttpResponseRedirect(reverse('login')) 

      logged_user = getRelatedWorker(request.user) 

      if (logged_user == None): 
       return HttpResponseRedirect('accounts/no_worker_error.html') 

      if self.manager != 0: 
       try: 
        dzial = Dzial.objects.get(kierownik=logged_user) 
       except Dzial.DoesNotExist: 
        isManager = False 
       else: 
        isManager = True 

       if not isManager: 
        return HttpResponseRedirect('accounts/denied_logged.html') 

      return func(request, *args, **kwargs) 
     return wrapper 
    return wrap 

代码看起来不错(我),但是当我使用一个装饰,我收到以下错误:

Environment: 

    Request Method: GET 
    Request URL: http://127.0.0.1:8080/applications/show 

    Django Version: 1.4.1 
    Python Version: 2.7.3 


Traceback: 
    File "/home/marcin/projekt/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
     188.     response = middleware_method(request, response) 
    File "/home/marcin/projekt/lib/python2.7/site-packages/django/middleware/common.py" in process_response 
     94.   if response.status_code == 404: 

    Exception Type: AttributeError at /applications/show 
    Exception Value: 'function' object has no attribute 'status_code' 

上午什么我做错了?

+1

你的意思是* CheckPermissions *而不是CheckPremissions? –

回答

7

我怀疑你是申请装饰者不正确。你需要把它指定manager参数:

@CheckPremissions() 
def someview(request): 
    pass 

或显式指定它:

@CheckPremissions(manager=0) 
def someview(request): 
    pass 

您的装饰不同的问题为好;你是指self.manager代码:

if self.manager != 0: 

但这是没有实例,并没有self参数。我认为你的意思是:

if manager: 

(你可以通过将它视为布尔值来测试变量是否为非零)。哦,你可能想修复装饰器的拼写;您可能的意思是CheckPermissions。 :-)

+1

你说得对。那个自我在那里,因为我之前试图做一个装饰类; p再次谢谢你:) – marxin