大约三个月前,我将旧的 Django 和 CMS 应用程序升级到(当时)最新的 LTS 版本(Django 为 4.2.3,django-cms 为 3.11.3)。升级后,当我在成功登录后尝试从 CMS 工具栏或 CMS 插件编辑任何内容时,出现以下错误:
SecurityError: Blocked a frame with origin "http://localhost:8000" from accessing a cross-origin frame.
经过简短的 Google 搜索,我能够通过在
CSRF_TRUSTED_ORIGINS
中设置 settings.py
(取决于环境)来解决该问题。
这就像一个魅力,直到几周前,突然又出现了同样的错误。尽管自 2023 年 7 月初以来没有部署任何新内容,但这种情况发生在我们的所有环境中(包括本地环境)。
首先,我尝试了本指南中的所有内容:https://noumenal.es/notes/til/django/csrf-trusted-origins/
我们的登台和生产 django 应用程序位于代理后面,因此我验证了
HttpRequest.is_secure()
返回 True
并且 X-Forwarded-Proto
标头在生产环境中设置为 https
。但这种情况也会发生在我的本地计算机上,那里没有 HTTPS。我还验证了请求中的 CSRF cookie 值和 CSRF 令牌参数实际上是相同的。
然后我尝试安装
django-cors-headers
模块并设置 CORS_ALLOWED_ORIGINS
,但没有成功。
对于本地开发,我有以下设置:
ALLOWED_HOSTS = ['localhost']
CSRF_TRUSTED_ORIGINS = ['http://localhost:8000']
CORS_ALLOWED_ORIGINS = ['http://localhost:8000']
日志根本没有提及此事。
除了
CSRF_TRUSTED_ORIGINS
配置错误之外,是否还有其他原因导致此消息突然出现?
根据您升级的版本,您可能错过了升级说明中的一些内容,3.7.2 中的新增功能。
Django 3.0 将 XFrameOptionsMiddleware 的默认行为从
更改为SAMEORIGIN
。为了让 django CMS 正常工作,需要将DENY
中的X_FRAME_OPTIONS
设置为SAMEORIGIN
:settings.py
X_FRAME_OPTIONS = 'SAMEORIGIN'
此选项在 CMS 内的每个页面上也可用,位于高级设置中。允许您覆盖设置文件中的默认值。