Django自定义视图装饰器

Cal*_*lum 10 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
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*man 17

你错过了装饰者的一个步骤,或者说你有一个困惑的步骤.它是必须返回内部函数()的外部函数,_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
Run Code Online (Sandbox Code Playgroud)