【问题标题】:Why xframe_options_exempt doesn't work for my Django view?为什么 xframe_options_exempt 不适用于我的 Django 视图?
【发布时间】:2014-08-02 10:40:43
【问题描述】:
我希望通过 iframe 从另一个域加载我的视图页面,因此按照 Django 文档,我将装饰器 @xframe_options_exempt 添加到我的视图中。但是在iframe中加载的时候,Chrome还是会报:
Uncaught SecurityError: Blocked a frame with origin "http://www.aaa.com" from access a frame with origin "http://bbb.com".
在 DevTools Network 选项卡中,我看到响应不包含“X-Frame-options”标头。
这里发生了什么?
【问题讨论】:
标签:
python
django
iframe
web
same-origin-policy
【解决方案1】:
您可能已经想通了,但遗憾的是 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.")
对于sameorigin和deny,应该是:
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
【解决方案2】:
我也遇到了同样的问题。就我而言,我提出了一个Http404 错误,这似乎以某种方式绕过了@xframe_options_exempt 装饰器。我怀疑如果您从视图中返回除 HttpResponse 对象以外的任何对象,那么您的 xframe_options_exempt 装饰器可能不会像您预期的那样执行。
注意Http404 类,例如does not inherit 来自HttpResponse。
【解决方案3】:
在您的 settings.py 文件中包含中间件
MIDDLEWARE_CLASSES = (
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
)
然后在您的 views.py 文件中包含所需的导入
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt