2012-09-12 4 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

CheckPremissions가 아닌 * CheckPermissions *를 의미합니까? –

답변

7

데코레이터를에 잘못 적용한 것으로 의심됩니다.

@CheckPremissions() 
def someview(request): 
    pass 

또는 명시 적으로 지정하려면 : 당신은 manager 매개 변수를 지정하는 데 호출 할 필요가 당신은뿐만 아니라 당신의 장식에서 다른 문제가

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

을; 당신은 코드에서 self.manager를 참조하십시오

if self.manager != 0: 

그러나 이것은 어떤 인스턴스 없으며 self 매개 변수가 없습니다. 나는 당신이 의미 생각 :

if manager: 

(변수가 부울로 처리하여 비 제로가 될 때까지 테스트 할 수있는). 아, 그리고 데코레이터의 철자를 수정하고 싶을 수도 있습니다. 아마도 CheckPermissions을 의미했을 것입니다. :-)

+1

네 말이 맞아. 내가 전에 데코레이터 클래스를 만들려고했기 때문에 그 자체가 있습니다; p 다시 한번 감사드립니다 :) – marxin

관련 문제