2010-02-18 64 views
1

我正在爲Django視圖創建裝飾器,它將檢查非Django託管數據庫中的權限。這裏是裝飾:Django裝飾獲取WSGIRequest而不是預期的函數參數

def check_ownership(failure_redirect_url='/', *args, **kwargs): 
    def _check_ownership(view): 
     def _wrapper(request, csi=None): 
      try: 
       opb_id=request.user.get_profile().opb_id 
       if opb_id and csi and model.is_users_server(opb_id, csi): 
        return view(*args, **kwargs) 
      except Exception, e: 
       logger.debug("Exception checking ownership: %s", str(e)) 
      return HttpResponseRedirect(failure_redirect_url) 
     _wrapper.__dict__=view.__dict__ 
     _wrapper.__doc__=view.__doc__ 
     return _wrapper 
    return _check_ownership 

這是如何被使用它:

@check_ownership 
def my_view(request, csi=None): 
    """Process my request""" 

check_ownership()被調用和返回_check_ownership()。當_check_ownership()被調用時,它被調用一個WSGIRequest對象,這是我所期望的_wrapper()被調用。任何人有任何想法,我的方法已經走了,我怎麼能得到它?我沒有辦法鏈接到下一個裝飾者或實際觀點。

哦,CentOS和Django 1.1.1上的Python 2.4.3。

我希望我的功能回來! ;)

謝謝。

TJ

回答

1
@check_ownership 
def my_view(request, csi=None): 
    ... 

翻譯成:

def my_view(request, csi=None): 
    ... 
my_view = check_ownership(my_view) 

check_ownership不接受功能,但_check_ownership一樣。這可能是你的問題所在。

0

所以這個問題與如何調用裝飾器有關。你得到不同的行爲與這些:

@my_decorator 

@my_decorator(someparam='someval') 

在第一種情況下,你可調用直接傳遞給my_decorator。在第二種情況下,您不會,但是您從my_decorator返回的可調用函數將會。

我敢肯定,這有一些深奧的原因,但它是,IMNSO,跛腳。它使得使用默認參數創建裝飾器的能力遠不如他們應該那樣清晰。

相關問題