我想通过来自其他域的iframe加载我的视图页面,因此在Django doc之后,我将装饰器@xframe_options_exempt
添加到我的视图中。但是当它加载到iframe中时,Chrome仍会报告:
Uncaught SecurityError:阻止原始“http://www.aaa.com”的框架访问原始“http://bbb.com”的框架。
从DevTools Network标签中,我看到响应不包含'X-Frame-options'标题。
这里发生了什么?
答案 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.")