Django: обработчик is_secure() не работает

Вопрос:

Я конвертирую некоторые 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?

Если вам больше нужен код или информация, пожалуйста, дайте мне знать. Спасибо за вашу помощь!

Лучший ответ:

Я думаю, что у вас есть signal и decorator смущенный, поскольку шаблон в вашем коде – decorator. В зависимости от того, что вы делаете, могут быть лучшие альтернативы тому, где вы добавляете логику перенаправления URL. Я думаю, что веб-сервер (nginx), HTTP Strict Transport Security HTTP-заголовок или промежуточное ПО. Сказав это, из django docs:

Чтобы украсить каждый экземпляр класса, вам необходимо украсить само определение класса. Для этого вы применяете декоратор к методу dispatch() класса.

Метод класса не совсем то же самое, что и автономная функция, поэтому вы не можете просто применить декоратор функции к методу – вам нужно сначала преобразовать его в декоратор метода. Декоратор method_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)

Оцените статью
TechArks.Ru
Добавить комментарий