为什么xframe_options_exempt对我的Django视图无效?
我想让我的页面通过iframe从另一个域名加载,所以按照Django的文档,我在我的视图上加了一个叫@xframe_options_exempt
的装饰器。但是当它在iframe中加载时,Chrome还是报错了:
未捕获的安全错误:阻止了来自 "http://www.aaa.com" 的框架访问来自 "http://bbb.com" 的框架。
在开发者工具的网络标签中,我看到响应中没有包含 'X-Frame-options' 这个头信息。
这到底是怎么回事呢?
3 个回答
0
你可能已经知道了,但很遗憾,Django的xframe_options_exempt功能目前只适用于HTTPResponse(截至2021年3月)。
使用它的一个例子是:
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的点击劫持保护
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
2
我刚遇到过同样的问题。在我的情况下,我抛出了一个 Http404
错误,这似乎会绕过 @xframe_options_exempt
这个装饰器。我怀疑如果你从视图中返回的不是 HttpResponse
对象,那么你的 xframe_options_exempt
装饰器可能不会像你预期的那样工作。
需要注意的是,Http404
这个类,比如说,并没有继承 自 HttpResponse
。