Django:CSRF验证失败。请求中止。在生产中没有域名

问题描述 投票:0回答:2

我在 Docker 环境中的 Nginx 后面运行 Django 应用程序。我的问题与此线程有点相同:Django 返回“CSRF 验证失败。请求中止。”在本地 Nginx 代理后面.

得知我必须在设置中添加

CSRF_TRUSTED_ORIGINS
,因为我使用的是Django 4.X版,所以我添加了本地主机

CSRF_TRUSTED_ORIGINS = [
    'http://localhost',
    'http://localhost:3000',
    'https://example.com',
]

当容器在本地部署时,我可以登录到我的管理员。但是,当我将其部署到生产环境时,仍然出现错误:

CSRF 验证失败。请求中止。

我将其部署在谷歌计算引擎中。该应用程序还没有域名。因此,我使用机器的外部地址访问该应用程序:

http://XX.XX.XX.XX/admin
。我应该把这个地址添加到我的
CSRF_TRUSTED_ORIGINS
吗?我的理解是,这与添加本地主机相同
http://localhost
,因为我正在访问主机的地址。

CSRF_TRUSTED_ORIGINS = [
    'http://localhost',
    'http://localhost:3000',
    'https://example.com',
    'http://XX.XX.XX.XX'
]

如果我将它部署到具有不同地址的另一台机器上怎么办?我应该再次添加它吗?有没有其他方法允许 CSRF 而无需专门添加地址,因为如果我要在主机中更改/迁移会很乏味?

这是我的nginx配置,如果有帮助的话。

upstream api {
    server container_name:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://api;
    }

    location /static/ {
        alias /static/;
    }
}
django nginx nginx-reverse-proxy
2个回答
0
投票

关于添加另一台机器的 IP 地址的问题,您还需要将其添加到您的 CSRF_TRUSTED_ORIGINS 设置中。如果不明确将源添加到受信任列表,就没有其他方法允许 CSRF。

如果您不想将特定 IP 地址或域名添加到受信任列表,您可以通过从 MIDDLEWARE 设置中删除 CsrfViewMiddleware 中间件来完全禁用 CSRF 保护。但是,不建议这样做,因为它可能会使您的应用容易受到 CSRF 攻击。


0
投票

在生产环境中,Django 的设置有点不同。您可以尝试以下两件事:

  1. setting.py
    中添加
    CSRF_TRUSTED_ORIGINS = ['https://your-domain.com']
  2. setting.py
    中添加
    STATIC_URL = 'static/'
    或您在nginx配置中更改的任何路径。

由于您在代理后面使用它,因此可能无法正确提供 js 和 CSS。在那种情况下,#2 很有用。

© www.soinside.com 2019 - 2024. All rights reserved.