Django 自定义视图装饰器

Posted

技术标签:

【中文标题】Django 自定义视图装饰器【英文标题】:Django Custom View Decorators 【发布时间】:2014-06-07 07:57:30 【问题描述】:

好吧,我在用户类中有一个名为 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 需要是什么,所以现在它只是谷歌。有任何想法吗?就像我说的,我以前没有写过装饰器,所以这对我来说是全新的。谢谢。

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

【问题讨论】:

【参考方案1】:

你在装饰器中缺少了一个步骤,或者说你混淆了一个步骤。 outer 函数必须返回内部函数 (_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

【讨论】:

谢谢你做得很好,我想在看了几个不同的例子后我有点困惑。我也尝试过 return render(...) 但它没有做任何事情;有没有办法可以渲染模板而不是重定向? 我的错,文件名中的错字:( 谢谢你,修复了我返回时的缩进错误

以上是关于Django 自定义视图装饰器的主要内容,如果未能解决你的问题,请参考以下文章

制作自定义 django 视图装饰器时遇到问题(带 args)

用于重定向的 Django 自定义装饰器

Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器

Django 自定义装饰器 - 函数没有属性 get

Django - 自定义装饰器 - 参数未填充

菊花链 Python/Django 自定义装饰器