Django/Wagtail 静态资产仅在登录但退出时返回 404

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

升级 Wagtail 和支持包后,我遇到了一个奇怪的问题,即所有静态资产(CSS、JS、字体等)在登录 Wagtail 管理时返回 404 错误,即。 sessionid 有效并在浏览器中设置。但是,在未登录时可以访问(没有 sessionid cookie)。这对于面向公众的网站以及

/admin

都是如此

网站运行中:

  • Django==4.1.8
  • 鹡鸰==4.2.2
  • 白噪声==6.4.0
  • Python==3.11.2
  • 通过 heroku 托管。

生产和开发(目前在本地)都使用

STATICFILES_STORAGE = whitenoise.storage.CompressedManifestStaticFilesStorage
STATIC_URL = "static/"
设置。迁移和
collectstatic
也已经运行。

我已经测试了几种方法:

使用卷曲

没有饼干:

curl -I http://127.0.0.1:8000/static/wagtailadmin/js/vendor.610e8c3f47d9.js

HTTP/1.1 200 OK
Date: Mon, 01 May 2023 06:11:55 GMT
Server: WSGIServer/0.2 CPython/3.11.2
Content-Type: text/javascript; charset="utf-8"
Cache-Control: max-age=315360000, public, immutable
Access-Control-Allow-Origin: *
Vary: Accept-Encoding, Cookie
Last-Modified: Mon, 01 May 2023 03:59:51 GMT
ETag: "644f3937-41103"
Content-Length: 266499
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
X-Frame-Options: DENY

饼干:

curl -I http://127.0.0.1:8000/static/wagtailadmin/js/vendor.610e8c3f47d9.js -H "Cookie: csrftoken=fPp7Oq2lR90jkilUiPDRHTOPTsu2lMZm;sessionid=his9jbjahqa3j86hjueeop0lno8pb4a9"

HTTP/1.1 404 Not Found
Date: Mon, 01 May 2023 06:15:53 GMT
Server: WSGIServer/0.2 CPython/3.11.2
Content-Type: text/html; charset=utf-8
Content-Length: 2761
Vary: Cookie

无效的sessionid: à la

sessionid=thisisnotvalid
返还资产罚款

为 STATIC_URL 设置完整的 URL

这就是它变得有趣的地方。 如果我设置

STATIC_URL = "http://127.0.0.1:8000/static/"
并通过
http://localhost:8000
登录,一切正常。如果我设置
STATIC_URL = "http://localhost:8000/static/"
没有骰子!如果我交换它们也是一样的。显然
STATIC_URL
WAGTAILADMIN_BASE_URL
不能相同。

在生产中,我真的没有(或不想)从单独的域提供资产的选项。我希望它能像正式那样工作。

调试设置

调试=真: 设置

STATIC_URL
static/
一起使用,但当它与访问域相同时不起作用,并且在设置为备用域时起作用。

DEBUG=假: 如上所述工作。

static/
和匹配域不起作用。一个替代品。

配置的相关位

base.py:

STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
]

STATICFILES_DIRS = [
    os.path.join(PROJECT_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

dev.py:

STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
STATIC_URL = "http://127.0.0.1:8000/static/"

production.py:

STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
STATIC_URL = "https://www.domainredacted.com/static/" # Formally just "static/"

已经很晚了,也许我在升级时遗漏了一些东西,但我似乎找不到它。非常感谢任何帮助。

应用程序和中间件:

INSTALLED_APPS = [
   ......
    "generic_chooser",
    "django_extensions",
    "storages",  # For S3 Storage
    "wagtail_2fa",
    "django_otp",
    "django_otp.plugins.otp_totp",
    "captcha",
    "wagtailcaptcha",
    "wagtail.contrib.modeladmin",
    "wagtail.contrib.forms",
    "wagtail.contrib.redirects",
    "wagtail.contrib.settings",
    "wagtail.contrib.routable_page",
    "wagtailmetadata",
    "wagtail.embeds",
    "wagtail.sites",
    "wagtail.users",
    "wagtail.snippets",
    "wagtail.documents",
    "wagtail.images",
    "wagtail.search",
    "wagtail.admin",
    "wagtail",
    "wagtail.contrib.search_promotions",
    "wagtail.contrib.table_block",
    "modelcluster",
    "taggit",
    "django.contrib.sitemaps",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "whitenoise.runserver_nostatic",
    "django.contrib.staticfiles",
]

MIDDLEWARE = [
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "wagtail_2fa.middleware.VerifyUserMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    "wagtail.contrib.redirects.middleware.RedirectMiddleware",
]
django heroku wagtail whitenoise wagtail-admin
© www.soinside.com 2019 - 2024. All rights reserved.