我們知道,django1.3開始django使用了一個叫做staticfiles的contrib app.
這個app主要是用來server靜態檔案的,與media的區別就是,staticfiles是網站本身需要用到的images,css,js,而media就是定義為網站使用者上傳的頭像,圖片,檔案等等.這樣一區分,就容易分開管理檔案了.static的優點就是集中管理django網站項目各個app使用的靜態檔案.
豆瓣有一篇介紹的比較詳細:django 1.3 中顯示圖片,使用靜態檔案的問題(django static files)
http://www.douban.com/note/152041308/
manage.py collectstatic 這一命令將散落在各個app子目錄下的static檔案夾中的靜態檔案複製到一個目錄(STATIC_ROOT,我用的是/static/,就是項目根目錄下的static檔案夾),同時被複製過來的還有STATICFILES_DIRS裡面的檔案.
我這裡就不廢話多說別人已經說過的東西了.
我要說的是,如何serve自己手動放進去的images,css,js等檔案.
因為我發現我以前django1.2之前的版本,所有網站使用的檔案都是放在media_root下面的.現在有了staticfiles,肯定還是放在static檔案夾下面,但是把一些公用的images,css檔案夾直接複製到static下面後,居然發現不能serve這些靜態檔案.瀏覽器中直接存取
http://localhost:8000/static/images/logo.jpg ,就會出現404錯誤.
我在網上找過一些這方面的資料,但是官方網站上說的是不要手動放置任何檔案到static目錄下.既然我的那些images是公用的檔案,又不屬於任何一個app,那就只有想別的辦法了.
新浪網上的朋友有一篇:django 架構下關於引用靜態檔案的配置方法
http://blog.sina.com.cn/s/blog_6b43aa770100taai.html
裡面說到的解決辦法是:
解決辦法: 1.通常在django下所有的靜態檔案(.img|.css|.js|other)都放在一個static檔案夾下2.在後來的處理當中,發現static檔案夾上一層還需要一個檔案夾,不要直接放在根目錄下.<<<他說的重點是把static不放在根目錄下,我不願意.
其實可以一試.不過我沒有按照這樣嘗試.還是從官方文檔中找線索.
STATICFILES_DIRS是一個可以引起注意的配置選項,我試著把它修改為:
STATICFILES_DIRS = ( STATIC_ROOT,)
但是它報錯說,STATIC_ROOT不能出現在STATICFILES_DIRS之中.
官網文檔提到是STATICFILES_DIRS中配置的目錄其實是tuple,例如:
STATICFILES_DIRS = ( # ... ("downloads", "/opt/webfiles/stats"),)
以上來自官網文檔:https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/
這個"downloads"其實是一個prefix,相對於STATIC_URL用的.所以可以使用http://localhost:8000/static/downloads 來訪問他定義的目錄下的資源.
所以我的嘗試就開始於這裡:
# Additional locations of static filesSTATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ("images", os.path.join(STATIC_ROOT,'images').replace('\\','/')), ("css", os.path.join(STATIC_ROOT,'css').replace('\\','/')), ("js", os.path.join(STATIC_ROOT,'js').replace('\\','/')),)
做了這些之後,OK了.
直接存取http://localhost:8000/static/images/logo.jpg 瀏覽器中能看到了.
行文至此,似乎多說的必要了.各位請拍磚.