Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 TemplateView的xframe\u选项\u豁免_Django_Iframe - Fatal编程技术网

Django TemplateView的xframe\u选项\u豁免

Django TemplateView的xframe\u选项\u豁免,django,iframe,Django,Iframe,我试图将decorator@xframe\u options\u empture添加到django模板视图中,但它带有 异常值:“dict”对象没有属性 “xframe\u选项\u豁免” 我注意到在Django 1.9文档中,decorator用于带有请求参数的视图,我使用的是TemplateView 可以这样使用吗 class MyView(TemplateView): """ """ template_name = 'app/template.html'

我试图将decorator@xframe\u options\u empture添加到django模板视图中,但它带有

异常值:“dict”对象没有属性 “xframe\u选项\u豁免”

我注意到在Django 1.9文档中,decorator用于带有请求参数的视图,我使用的是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中。如果其他任何人有此问题,此装饰器无法应用于获取上下文数据方法,但您可以从TemplateView重写获取方法,类似于:

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
这将实现技巧

当您是时,您应该使用
方法\u decorator
。您应该重写将
请求
作为参数的方法,例如
分派
(将适用于所有请求类型)或
获取
(将适用于获取请求,但不适用于post请求)。正如您所发现的,装饰
get\u context\u 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+)


基于可用的
@xframe\u options\u export
decorator,您还可以实现要混合到视图类中的mixin类:

class XFrameOptionsExemptMixin:
    @xframe_options_exempt
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

class SomeView(XFrameOptionsExemptMixin, TemplateView):
    …

很好,我知道有一个更干净的方法可以做到这一点,所以我尝试了上面两个版本,但没有一个对我有效。它说“拒绝在框架中显示*,因为它将“X-frame-Options”设置为“SAMEORIGIN”。“知道为什么吗?与其在这里发表评论,不如提出新问题。”。我不熟悉clickjacking保护功能,所以我没办法。
class XFrameOptionsExemptMixin:
    @xframe_options_exempt
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

class SomeView(XFrameOptionsExemptMixin, TemplateView):
    …