【问题标题】:Django Custom View DecoratorsDjango 自定义视图装饰器
【发布时间】: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 需要是什么,所以现在它只是谷歌。有任何想法吗?就像我说的,我以前没有写过装饰器,所以这对我来说是全新的。谢谢。

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

【问题讨论】:

    标签: python django decorator python-decorators


    【解决方案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(...) 但它没有做任何事情;有没有办法可以渲染模板而不是重定向?
    • 我的错,文件名中的错字:(
    • 谢谢你,修复了我返回时的缩进错误
    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2016-08-16
    • 2013-02-06
    • 2011-10-16
    • 2015-03-25
    • 2018-11-21
    相关资源
    最近更新 更多