Django 应用程序在本地运行,但我在 Heroku 上的 CSRF 验证失败

Django app runs locally but I get CSRF verification failed on Heroku

我的应用程序在 heroku local 时运行良好,但在部署到 Heroku 后,每次我尝试 login/register/login 作为管理员时,它 returns 如下所示的错误。

我尝试将 @csrf_exempt 放在 profile 视图上,但这并没有解决问题。

我能做什么?

您的项目 setting.py 文件中似乎没有您的 heroku 地址作为可信来源,为此,您可以使用 corsheaders

pip install django-cors-headers 

然后在您的 settings.py 文件中

    INSTALLED_APPS = [ 
   ...
   'corsheaders',  
   ...
]

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  ...
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'corsheaders.middleware.CorsMiddleware',
]

如果您尚未部署,您可以添加 CORS_ORIGIN_ALLOW_ALL = True,但是因为您知道您的应用部署在哪里,所以使用白名单作为来源是一个更好的主意

CORS_ORIGIN_WHITELIST = (
  'https://pacific-coast-78888.herokuapp.com',
)

错误信息是不言自明的(请原谅打字错误,因为我无法从图像中复制):

Origin checking failed - https://pacific-coast-78888.herokuapp.com does not match any trusted origins

您使用的域不是 CSRF 的可信来源。

文档中有一个 link,我怀疑转到 the Django CSRF documentation, though the documentation for the CSRF_TRUSTED_ORIGINS setting 可能更有用:

A list of trusted origins for unsafe requests (e.g. POST).

For requests that include the Origin header, Django’s CSRF protection requires that header match the origin present in the Host header.

在您的 settings.py 中查找 CSRF_TRUSTED_ORIGINS 并将 https://pacific-coast-78888.herokuapp.com 添加到列表中。如果该设置尚不存在,只需添加它:

CSRF_TRUSTED_ORIGINS = ["https://pacific-coast-78888.herokuapp.com"]

如果Heroku使用django“4.x.x”版本:

那么,如果错误如下图:

Origin checking failed - https://example.com does not match any trusted origins.

将下面的代码添加到 "settings.py":

CSRF_TRUSTED_ORIGINS = ['https://example.com']

在你的例子中,你得到了这个错误:

Origin checking failed - https://pacific-coast-78888.herokuapp.com does not match any trusted origins.

因此,您需要将下面的代码添加到 您的“settings.py”:

CSRF_TRUSTED_ORIGINS = ['https://pacific-coast-78888.herokuapp.com']

我遇到了同样的错误,只是将我的 DjangoVersion==4.0.4 降级为 DangoVersion==3.2.13。它对我有用。