首页 > 解决方案 > Django静态文件通过collectstatic递归保存创建膨胀

问题描述

在我的生产系统上运行 collectstatic 时,似乎递归存储了一堆文件,例如(真实示例):

'production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/production/css/lib/nestable/nestable.css'

每次我更新我的静态文件时都会导致膨胀(当我为前端更新任何 javascript 时这是必要的)。

我的 settings.py 文件有以下内容:

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

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

])

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)我的主要 urls.py 中也有

在我的 Nginx 可用站点配置文件中,我有以下几行:

location /static/ {
        alias /home/ubuntu/myapp/static/production/;
        expires modified +1w;
    }

为了规避这个问题,我现在必须运行 collectstatic -c 并在每次更新时删除我的所有静态文件,这并不理想。

我哪里错了?

标签: djangonginx

解决方案


这是因为您将收集的静态文件存储在静态源目录中。

Django 中的静态文件可以来自任何 Django 应用程序,因为应用程序可以定义自己的静态文件。为了简化您的服务器配置,所有静态文件都必须从您的项目和所有使用的应用程序中收集到一个目录,您的 Web 服务器可以从该目录中为它们提供服务。

STATIC_ROOT是将收集所有静态文件的中央目录的位置。

STATIC_URLSTATIC_ROOT从 Web 服务器端点反映您的情况。换句话说,在此 URL 上的所有文件STATIC_URL都将由您的服务器提供。

STATICFILES_DIRSstatic来自每个应用程序的目录一起是所有文件应该收集(复制)到该目录的STATIC_ROOT目录。

在您的示例中,您将您的路径存储STATIC_ROOT在 中定义的路径中STATICFILES_DIRS,因此每次运行collectstaticdjango 后都会将所有内容复制STATICFILES_DIRS到您的STATIC_ROOT中,包括STATIC_ROOT之前复制的内容。

要解决您的问题,请隔离文件系统中的这两个位置并相应地调整您的 Django 设置。


推荐阅读