好吧我在用户类中有一个名为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需要什么,所以它现在只是google。有任何想法吗?就像我说的那样,我之前没有写过装饰器,所以对我来说都是新手。三江源。
另一个想法:是否可以渲染模板页面?
答案 0 :(得分:16)
你错过了装饰者中的一个步骤,或者说你有一步困惑。它是外部函数必须返回内部函数(_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