如何在Django中配置X-Frame-Options以允许嵌入一个视图的iframe?

42

我正在尝试启用django,允许一个特定的视图被嵌入到外部网站上,最好不受网站限制。

在我的views.py文件中,我已经添加了以下代码,其中视图futurebig是我想要启用嵌入的视图:

from django.views.decorators.clickjacking import xframe_options_sameorigin
...
@xframe_options_sameorigin
def futurebig(request):
    ...
    return render_to_response('templates/iframe/future_clock_big.html', context_dict, context)

据我所知,这并没有帮助,因为它只能在同一服务器上嵌入。

我该如何设置特定视图的头部信息,以便它可以在任何网站中被嵌入?

顺便说一句,我只是一个前端开发人员,后端开发人员不再与我合作,并拒绝记录他的代码,如果有人能帮我并仔细解释我应该做哪些修改,我将非常感激。

谢谢。

据我所知,Django 版本是 1.6。

3个回答

85

你正在朝着正确的方向前进,但是你需要使用的确切装饰器是'xframe_options_exempt'。

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.")

PS: DJango 1.6 不再受支持。现在是升级的好时机。


8
我认为,我们需要一个修饰符来允许 iframe 选项中的 ALLOW-FROM 来指定可接受的域名,而不仅仅是删除 X-Frame 头。请有权限的人创建工单(我没有权限)。具体详情可参考链接:https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/X-Frame-Options。 - LennyLip

26

显然你可以在设置中设定一个规则来告诉以下内容:

X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'

现在你应该考虑转移到CSP

Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;

请参见https://dev59.com/R2kv5IYBdhLWcg3w_lzE#25617678


3
ALLOW-FROM将不支持Chrome和Safari浏览器。 - Sarath Ak
不再使用ALLOW-FROM:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options。正如@Natim所说:转移到CSP! - Adrian

0
如果您想在特定视图中允许框架,则可以将Content-Security-Policy添加到您的视图响应中,这样您的代码将类似于以下内容。
def MyView(request):
    ....
    ....
    response = render(request,'MyViewHtml.html' ,{...})
    response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接