Django装饰器获取WSGIRequest而不是预期的函数参数

时间:2010-02-18 19:35:12

标签: python django decorator

我正在为Django视图创建一个装饰器,它将检查非Django管理的数据库中的权限。这是装饰者:

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上的Python 2.4.3和Django 1.1.1。

我想恢复我的功能! ;)

感谢。

TJ

2 个答案:

答案 0 :(得分: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会接受函数。这可能是你的问题所在。

答案 1 :(得分:0)

所以这个问题与装饰器的调用方式有关。你会得到不同的行为:

@my_decorator

@my_decorator(someparam='someval')

在第一种情况下,您可以将callable直接传递给my_decorator。在第二种情况下,你没有,但你从my_decorator返回的可调用对象将会。

我确信这有一些深奥的原因,但它是,IMNSO,跛脚。它使创建具有默认参数的装饰器远不如它们应该清晰。