Python Django自定义视图装饰器
好的,我在user类中有一个名为no_m的方法,我以前没有写过decorator,但是基本上我需要将用户重定向到另一个URL,如果他们传递这个。我已经在名为accounts的目录中创建了一个名为decorators.py的文件,我猜decorator导入正确,但是我无法让它工作。以下是我所拥有的: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:
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(…),但它什么也没做;有没有一种方法我可以呈现一个模板而不是重定向?我的错误,文件名中的输入错误:(谢谢,修复了返回时的缩进错误