2019年11月13日 星期三

如何在Django正確使用ManifestStaticFilesStorage這個功能


假設Django專案目錄在/home/myproj。在settings.py要設定
# 靜態檔案對應的URL
STATIC_URL = '/static/'
# 靜態檔案放置的位置,這裡就等於/home/myproj/static
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 放置其他靜態檔案的路徑,把css/js等檔案放在這,以下的設置等於/home/myproj/staticfile
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "staticfile"),
)
# 使用ManifestStaticFilesStorage作為靜態檔案處理方式
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

 在正式運行的伺服器執行
./manage.py collectstatic -v 3
會看到css跟js等檔案都複製到static目錄,並產生附加hash值的檔案。
...
Post-processed 'css/bootstrap.min.css' as 'css/bootstrap.min.a15c2ac3234a.css'
...
每次更動這些檔案後都要執行collectstatic,否則會出錯。

在基礎樣板載入靜態檔案要使用{% load static %}與{% static 'css/bootstrap.min.css' %}來載入靜態檔案。

在Nginx關於靜態檔案目錄的設置
...
location /static {
        alias /home/myproj/static;
    }
...

如果把css/js等檔案放在STATIC_ROOT裡頭,那麼執行collectstatic就不會產生附加hash值的檔案,瀏覽網站就會跳出500錯誤。錯誤Log會有ValueError: Missing staticfiles manifest entry for .... 的訊息。