为什么xframe_options_exempt不能用于我的Django视图?

时间:2014-06-12 07:27:02

标签: python django iframe web same-origin-policy

我想通过来自其他域的iframe加载我的视图页面,因此在Django doc之后,我将装饰器@xframe_options_exempt添加到我的视图中。但是当它加载到iframe中时,Chrome仍会报告:

  

Uncaught SecurityError:阻止原始“http://www.aaa.com”的框架访问原始“http://bbb.com”的框架。

从DevTools Network标签中,我看到响应不包含'X-Frame-options'标题。

这里发生了什么?

3 个答案:

答案 0 :(得分:1)

settings.py 文件中加入中间件

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
)

然后在 views.py 文件中包含所需的导入

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt

答案 1 :(得分:1)

我遇到了同样的问题。在我的情况下,我提出Http404错误,似乎以某种方式绕过了@xframe_options_exempt装饰器。我怀疑如果您从视图中返回HttpResponse对象以外的任何内容,那么您的xframe_options_exempt装饰器可能无法按预期执行。

请注意Http404类,例如来自HttpResponse的{​​{3}}。

答案 2 :(得分:0)

您可能已经想通了,但遗憾的是,Django xframe_options_exempt 仅适用于当前版本(2021 年 3 月)的 HTTPResponse。

如何使用它的一个例子是:

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt 

@xframe_options_exempt
def ok_to_load_in_a_frame(request):
    return HttpResponse("This page is safe to load in a frame on any site.")

对于同源和拒绝,它将是:

from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin

@xframe_options_deny
def view_one(request):
    return HttpResponse("Frame won't be displayed!")

@xframe_options_sameorigin
def view_two(request):
    return HttpResponse("Display onlly if from the same origin host.")

引用自 Django Clickjacking Protection