如何将Django模板页面嵌入iframe并解决ERR_BLOCKED_BY_RESPONSE报错
问题解决指南
核心原因
你遇到的ERR_BLOCKED_BY_RESPONSE错误是Django默认的安全策略导致的:Django默认给所有响应添加X-Frame-Options: DENY响应头,禁止页面被嵌入任何iframe中。你能看到rejestracja.html的完整源码,说明请求本身已经成功返回,只是浏览器识别到该响应头后主动阻止了页面渲染,和你的路由、模板代码没有关联。
排查与解决步骤
- 第一步先验证响应头:打开浏览器开发者工具的「网络」面板,刷新页面后找到
rejestracja/对应的请求,查看响应头中是否存在X-Frame-Options: DENY字段,确认是该配置导致的拦截 - 同域名嵌入解决方案:如果iframe的父页面和
rejestracja/路由属于同一个域名,直接在Django项目的settings.py中添加配置:
该配置会允许同域名下的页面嵌入iframe,不影响跨域拦截的安全性X_FRAME_OPTIONS = 'SAMEORIGIN' - 跨域名嵌入解决方案:如果父页面和iframe域名不一致,需要给指定视图解除iframe限制,不需要修改全局配置:
- 在视图文件头部导入装饰器:
from django.views.decorators.clickjacking import xframe_options_exempt - 给
rejestracja视图添加装饰器:@xframe_options_exempt def rejestracja(request): # 原有视图逻辑
- 在视图文件头部导入装饰器:
- 额外排查项:如果你的项目部署时使用了Nginx、Apache等反向代理服务,需要检查代理配置中是否强制添加了
X-Frame-Options响应头,代理层的头配置优先级高于Django本身的配置,如有需要同步修改 - 特殊情况排查:如果你配置了CSP(内容安全策略),需要检查
frame-ancestors指令是否允许了父页面的域名,CSP的iframe限制优先级高于X-Frame-Options,如有需要对应调整CSP规则
内容的提问来源于stack exchange,提问作者Andrzej Krynski
相关产品推荐
相关产品推荐

