Django 自定义视图装饰器

13 投票
1 回答
7306 浏览
提问于 2025-04-18 03:48

好的,我在用户类里有一个叫做 no_m 的方法,我之前没写过装饰器,但基本上我需要在用户通过这个方法后,把他们重定向到另一个网址。我在一个叫做 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,所以暂时用谷歌的地址。有没有什么想法?正如我所说,我之前没写过装饰器,所以这对我来说都是新鲜事。谢谢你。

还有一个想法:能不能渲染一个模板页面呢?

1 个回答

20

你在装饰器的步骤上漏掉了一步,或者说你把某个步骤搞混了。实际上,是外层函数需要返回内层函数(_wrapped_view_func),而且这个步骤必须始终执行:这就是当调用原始函数时,替代它的部分。

我不太明白那个except语句是干嘛的。除了使用空的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

撰写回答