找不到 Django 管理和 wagtail 静态文件

Django admin and wagtail static files not found

我有一个 Django 站点,其中集成了 wagtail 和 puput,以及 whitenoise 处理静态文件。出于某种原因,在生产中,静态文件适用于常规站点,但不适用于 django 管理员或 wagtail 管理员。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
    path('', views.home, name='home'),
    path('clubs/', include('clubs.urls', namespace="clubs")),
    path('members/', include('members.urls', namespace="members")),
    path('videos/', include('videos.urls', namespace="videos")),
    path('cms/', include(wagtailadmin_urls)),
    path('documents/', include(wagtaildocs_urls)),
    path('blog/', include(wagtail_urls)),
    path('posts/', include(puput_urls)),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

文件夹结构

staticfiles/
    admin/
    wagtailadmin/
    ...

使用 whitenoise 时,您不需要将静态路径添加到您的 urlpatterns。它的配置通过添加 middleware.

来处理

此外,为此目的使用 django.views.static.serve()(看起来这就是您在示例中所做的)是 not suitable for production。文档指出

This helper function works only in debug mode

这可能与您遇到的问题有关。

好的,我发现了问题,它出在我的 nginx 设置中。我使用的是 root 指令而不是别名。这意味着它在路径中添加 /static,因此它在原始静态文件夹中获取文件,而不是静态根目录,即 /staticfiles。所以而不是这个

location /static/ {
    root /home/web/capclub;
}

应该是

    location /static/ {
    alias /home/web/capclub/staticfiles;
}