首页 > 解决方案 > 部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误

问题描述

我有一个在本地运行良好的 django 站点,但是在尝试使用 AWS elastic beanstalk 进行部署时,当我尝试登录时出现以下错误(使用 django allauth)

禁止 (403) CSRF 验证失败。请求中止。

日志状态:

禁止(未设置 CSRF cookie。):/accounts/login/

我的 settings.py 中间件有:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.common.BrokenLinkEmailsMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

如果我注释掉“django.middleware.csrf.CsrfViewMiddleware”那么它工作正常

表单有一个 csrf_token:

<form class="login" method="POST" action="{% url 'account_login' %}">
  {% csrf_token %}
  {{ form|crispy }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <a class="button secondaryAction" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
  <button class="primaryAction btn btn-primary" type="submit">{% trans "Sign In" %}</button>
</form>

关于如何修复以及为什么它在本地运行正常但在部署时无法运行的任何建议表示赞赏

标签: pythondjangoamazon-web-servicesamazon-elastic-beanstalkcsrf

解决方案


如果您最近升级到 Django 4.0,您现在需要设置 CSRF_TRUSTED_ORIGINS - 这在我的情况下修复了错误。https://docs.djangoproject.com/en/4.0/ref/settings/#csrf-trusted-origins


推荐阅读