为什么 Django 站点不能嵌入另一个 HTML(iframe)中?

2024-02-09

我尝试在另一个 html 页面中嵌入 django 表单,但它不起作用。我尝试了其他 django 网站。但没有任何效果。还对其他一些网站进行了测试。 django 是否限制在 iframe 中使用?如何让它发挥作用? 需要嵌入的表格编程竞赛形式 http://form.classof20.cf/Programming_Competition/

模板:

<form method="post">
  {% csrf_token %}
  <b>{{form.as_p}}</b>
  <input type="submit" value="Submit" title="Submit" />
</form>

尝试嵌入为:

<html>
<iframe frameborder="1" src="http://form.classof20.cf/Programming_Competition/"></iframe>
</html>

它给出了一个边界,里面什么也没有。


这是尝试加载 HTML 后 webkit 检查器中的错误:

Refused to display 'http://form.classof20.cf/Programming_Competition/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.
Failed to load resource: net::ERR_BLOCKED_BY_RESPONSE

事实上,这里是curl 的响应头转储:

$ curl -I http://form.classof20.cf/Programming_Competition/

HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 06 Sep 2017 19:44:16 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 765
Connection: keep-alive
Vary: Cookie
X-Frame-Options: SAMEORIGIN
Set-Cookie: csrftoken=UJZltdTzJMe6961QMNRSgZ7vKWa1vUEf2lEB8lmaaZXgROf1zyALsuwsKpvtcby6; expires=Wed, 05-Sep-2018 19:44:16 GMT; Max-Age=31449600; Path=/

那么,它从哪里来?它来自Django 点击劫持保护 https://docs.djangoproject.com/en/1.11/ref/clickjacking/.

解决方案 0:确保你的 django 响应允许您在 X-Frame-Options 中使用其他站点 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options, ie:

X-Frame-Options: ALLOW-FROM http://your-other-site-which-embeds/

解决方案 1:使您的表单视图免受点击劫持保护:

使用中间件时可能会出现一些你不知道的视图 想要设置 X-Frame-Options 标头。对于这些情况,您可以使用 告诉中间件不要设置标头的视图装饰器:

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.")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Django 站点不能嵌入另一个 HTML(iframe)中? 的相关文章