1. 程式人生 > >django中STATIC_ROOT和STATICFILES_DIRS區別 及MEDIA_ROOT

django中STATIC_ROOT和STATICFILES_DIRS區別 及MEDIA_ROOT

staticfiles:這是一個靜態資源管理的app,django.contrib.staticfiles。老的版本中,靜態資源管理一直是一個問題,部分app釋出的時候需要帶上靜態資源,在部署的時候必須將每個app存在的static(這個目錄是自己建立的)靜態資源複製到專案根目錄下同一個static目錄(即staticfiles在專案目錄下生成的static,與每個app下的static不同)。引入staticfiles之後,執行命令:python manage.py collectstatic就可以方便的將所用到的app中的靜態資源複製到同一目錄。

使用python manage.py collectstatic

時專案settings.py中必須有(把所有app目錄中的static集中到,專案目錄中的static中)

STATIC_ROOT = os.path.join(BASE_DIR, "static")否則會提示錯誤,如下:

raise ImproperlyConfigured("You're using the staticfiles app "
django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.


此時如果刪除app目錄下static目錄,會有403錯誤。

要把settings.py中STATIC_ROOT = os.path.join(BASE_DIR, "static")改為

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

省事可以不把app目錄下static目錄刪除也不用在變動修改STATIC_ROOT

app目錄下static目錄刪除也可以,但要在urls.py中加入靜態檔案處理的程式碼:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# This will work if DEBUG is Trueurlpatterns += staticfiles_urlpatterns()還要把settings.py中STATIC_ROOT = os.path.join(BASE_DIR, "static")改為

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

staticfiles的主要相關配置與分析

  • STATIC_ROOT:執行上邊提到的命令:python manage.py collectstatic 之後靜態檔案將要複製到的目錄,這個目錄只有在執行collectstatic時候才會用到,不能想當然的以為這個目錄和MEDIA_ROOT的作用是相同的,否則在開發環境的時候可能一直無法找到靜態檔案。

  • STATIC_URL:設定的static file的起始url,這個只是在template裡邊引用到,這個引數和MEDIA_URL的含義相同

  • STATICFILES_DIRS:和TEMPLATE_DIRS的含義差不多,就是除了各個app的static目錄以外還需要管理的靜態檔案設定,比如專案的公共檔案差不多。

  • 各個app目錄下的靜態檔案static/django會自動找到,這個點和app下的templates目錄下差不多

urls.py中加入靜態檔案處理的程式碼:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns# This will work if DEBUG is Trueurlpatterns += staticfiles_urlpatterns()STATIC_ROOT及MEDIA_ROOT
1.3之前只有MEDIA_ROOT,不管是網站靜態檔案(js、css等)還是使用者上傳的檔案都在同一個目錄下。1.3開始兩個目錄分開了這個MEDIA目錄是在app根目錄下新建的,不是專案根目錄

補充:

注意沒有和nginx一起部署時,DEBUG =

True才能訪問django靜態資源。