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)