我正在尝试将装饰器@xframe_options_exempt添加到django模板视图中,但它抱怨了
异常值:'dict'对象没有属性 'xframe_options_exempt'
我注意到在Django 1.9文档中,装饰器用于带有请求参数的视图,我使用的是TemplateView。
是否可以像这样使用它?
class MyView(TemplateView):
"""
"""
template_name = 'app/template.html'
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def get_context_data(self, **kwargs):
context = {}
context['test'] = 'hello'
return context
基本上我需要将一个django模板视图嵌入到iframe
中答案 0 :(得分:8)
当你decorating class based views时,你应该使用method_decorator
。您应该覆盖将request
作为参数的方法,例如dispatch
(将适用于所有请求类型)或get
(将适用于获取请求但不适用于发布请求)。如您所见,装饰get_context_data
将无效。
class MyView(TemplateView):
@method_decorator(xframe_options_exempt):
def dispatch(self, *args, **kwargs):
return super(MyView, self).dispatch(*args, **kwargs)
请注意,使用super()
您不必复制TemplateView
中的代码。
Django 1.9允许你根据自己的喜好来装饰课程:
@method_decorator(xframe_options_exempt, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
答案 1 :(得分:0)
好吧,如果其他人有这个问题,这个装饰器不能应用于get_context_data方法,但你可以从TemplateView覆盖get方法,如下所示:
class MyView(TemplateView):
"""
"""
template_name = 'app/template.html'
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
return self.render_to_response(context)
def get_context_data(self, **kwargs):
context = {}
context['test'] = 'hello'
return context
这将解决问题
答案 2 :(得分:0)
基于可用的@xframe_options_exempt
装饰器,您还可以实现一个mixin类以将其混合到视图类中:
class XFrameOptionsExemptMixin:
@xframe_options_exempt
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
class SomeView(XFrameOptionsExemptMixin, TemplateView):
…