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

Posted

技术标签:

【中文标题】如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?【英文标题】:How to configure X-Frame-Options in Django to allow iframe embedding of one view? 【发布时间】:2016-01-20 22:14:21 【问题描述】:

我正在尝试启用 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

【问题讨论】:

【参考方案1】:

如果您想在特定视图中允许框架,您可以将 Content-Security-Policy 添加到您的视图响应中,因此您的代码将是这样的

def MyView(request):
    ....
    ....
    response = render(request,'MyViewHtml.html' ,...)
    response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"

【讨论】:

【参考方案2】:

显然,您可以在设置中设置一条规则,告诉以下内容:

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

现在你也应该考虑迁移到 CSP

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

见https://***.com/a/25617678/186202

【讨论】:

ALLOW-FROM 将不支持 chrome 和 safari 并且 ALLOW-FROM 不应再使用:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…。正如@Natim 所说:转向 CSP!【参考方案3】:

您正朝着正确的方向前进,但实现此目标所需的确切装饰器是“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 不再受支持。现在是升级的好时机。

【讨论】:

我认为,我们需要 iframe 选项 developer.mozilla.org/ru/docs/Web/HTTP/Headers/X-Frame-Options 的 ALLOW-FROM 装饰器来定义可接受的域,而不仅仅是删除 X-Frame Header,请有人创建票证(我无权访问)

以上是关于如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python/Django 中,如何配置默认测试设置?

如何在 pycharm 中配置项目类型以创建 django 应用程序

如何在Django中配置MySQL数据库

django缓存优化中caches参数如何配置?

如何使用 Django 配置 Celery 守护进程

如何配置在Django中注销后重定向到哪里?