Django TemplateView的xframe_options_exempt

时间:2016-05-24 15:35:38

标签: django iframe

我正在尝试将装饰器@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

3 个答案:

答案 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):
    …