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
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
True
urlpatterns += 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
True
urlpatterns += staticfiles_urlpatterns()
STATIC_ROOT及MEDIA_ROOT
1.3之前只有MEDIA_ROOT,不管是網站靜態檔案(js、css等)還是使用者上傳的檔案都在同一個目錄下。1.3開始兩個目錄分開了
這個MEDIA目錄是在app根目錄下新建的,不是專案根目錄
補充:
注意沒有和nginx一起部署時,DEBUG =
True才能訪問django靜態資源。