Python Django自定义视图装饰器

Python Django自定义视图装饰器,python,django,decorator,python-decorators,Python,Django,Decorator,Python Decorators,好的,我在user类中有一个名为no_m的方法,我以前没有写过decorator,但是基本上我需要将用户重定向到另一个URL,如果他们传递这个。我已经在名为accounts的目录中创建了一个名为decorators.py的文件,我猜decorator导入正确,但是我无法让它工作。以下是我所拥有的: def no_m(view_func): def _wrapped_view_func(request, *args, **kwargs): try:

好的,我在user类中有一个名为no_m的方法,我以前没有写过decorator,但是基本上我需要将用户重定向到另一个URL,如果他们传递这个。我已经在名为accounts的目录中创建了一个名为decorators.py的文件,我猜decorator导入正确,但是我无法让它工作。以下是我所拥有的:

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需要是什么,所以现在只需要谷歌。有什么想法吗?就像我说的,我以前没有写过装饰师,所以这对我来说是全新的。谢谢


另一个想法是:有可能呈现一个模板页面吗

你在装饰中遗漏了一个步骤,或者更确切地说,你把一个步骤弄糊涂了。外部函数必须返回内部函数(
\u wrapped\u view\u func
),并且它必须始终这样做:这就是调用原始函数时替代原始函数的地方

我不知道except条款是干什么用的。除了使用空白except(它捕获所有内容,包括ctrl-c之类的内容)总是一个坏主意之外,Django函数中的异常通常由中间件处理,而不是由decorator处理。我会把它拿走

因此,代码应该是:

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

谢谢你,效果很好,我想在看了几个不同的例子后,我有点困惑。我也尝试过使用returnrender(…),但它什么也没做;有没有一种方法我可以呈现一个模板而不是重定向?我的错误,文件名中的输入错误:(谢谢,修复了返回时的缩进错误