Django 自定义视图装饰器
好的,我在用户类里有一个叫做 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