Django自定义视图装饰器

时间:2014-04-22 19:05:46

标签: python django decorator python-decorators

好吧我在用户类中有一个名为no_m的方法,之前我没有写过装饰器,但基本上我需要将用户重定向到另一个URL,如果他们通过了这个。我在一个名为accounts的目录中创建了一个名为decorators.py的文件,并且我猜测装饰器是否正确导入,但我无法使其工作。继承人我所拥有的:

def no_m(view_func):
    def _wrapped_view_func(request, *args, **kwargs): 
        try:        
            if request.user.is_m():     
                # quick test
                return HttpResponseRedirect('http://google.com')            
            else:
                 return view_func(request, *args, **kwargs)     
        except:     
            return _wrapped_view_func

所有它需要做的是重定向用户,如果他们通过该测试,我不知道URL需要什么,所以它现在只是google。有任何想法吗?就像我说的那样,我之前没有写过装饰器,所以对我来说都是新手。三江源。

另一个想法:是否可以渲染模板页面?

1 个答案:

答案 0 :(得分:16)

你错过了装饰者中的一个步骤,或者说你有一步困惑。它是外部函数必须返回内部函数(_wrapped_view_func),它必须总是这样做:这就是取代原始函数的原因被称为。

我不确定except子句的用途。除了使用空白之外总是一个坏主意 - 除了捕获所有内容,包括像ctrl-c这样的东西 - Django函数中的异常通常由中间件而不是装饰器处理。我会删除它。

所以代码应该是:

def no_m(view_func):
    def _wrapped_view_func(request, *args, **kwargs): 
        if request.user.is_m():     
            # quick test
            return HttpResponseRedirect('http://google.com')            
        else:
             return view_func(request, *args, **kwargs)     
    return _wrapped_view_func