Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:u secure()修饰符不工作吗_Django - Fatal编程技术网

Django:u secure()修饰符不工作吗

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()

我正在将一些带有信号的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()
            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)