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