Django:u secure()修饰符不工作吗
我正在将一些带有信号的FBV转换为CBV,所以我有一个装饰器:Django:u secure()修饰符不工作吗,django,Django,我正在将一些带有信号的FBV转换为CBV,所以我有一个装饰器: def ensure_https(view_func): def _checkssl(request, *args, **kwargs): print request.is_secure() if not settings.DEBUG and not request.is_secure(): url_str = request.build_absolute_uri()
def ensure_https(view_func):
def _checkssl(request, *args, **kwargs):
print request.is_secure()
if not settings.DEBUG and not request.is_secure():
url_str = request.build_absolute_uri()
url_str = url_str.replace('http://', 'https://')
return HttpResponseRedirect(url_str)
return view_func(request, *args, **kwargs)
return _checkssl
并将其添加到基于类的视图中的函数中,如下所示:
class ExampleTemplateView(TemplateView):
template_name = 'example.html'
@ensure_https
def dispatch(self, request, *args, **kwargs):
...
return HttpResponseRedirect(/hello/')
但我得到了以下错误:
'ExampleTemplateView' object has no attribute 'is_secure'
然而,当我在基于函数的视图上使用这个装饰器时,它工作得很好。我应该使用特定的CBV吗
如果您需要更多的代码或信息,请让我知道。谢谢你的帮助 我想你把
信号
和装饰器
弄糊涂了,因为你的代码中的模式是装饰器
。根据您正在做的事情,可能会有更好的替代方法来放置URL重定向逻辑。我在想webserver(nginx),或者。话虽如此
要修饰基于类的视图的每个实例,需要修饰
类定义本身。为此,您将装饰器应用于
类的dispatch()方法
类上的方法与独立函数不同,因此
您不能只将函数装饰器应用于该方法–您需要
首先将其转换为方法装饰器。decorator的方法
decorator将函数decorator转换为方法decorator,因此
它可以用于实例方法。例如:
你说得很对!装饰器没有信号。我脑子里还有其他事情…谢谢!
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)