setting.py 的 Debug 一直是True 的, 今天模擬上線操做,發現 當設置爲 false 的時候,打開界面 首頁那叫個一塌糊塗啊.. css
因而google 了下,找到了緣由. html
如下是google 的文章 java
原文連接: 老魚的博客 python
從開始接接觸python這門語言已有 四年了,中間陸續的學習,又不斷的忘記,因此基本上是沒有系統的知識體系。可是挺喜歡這門簡潔,強大的動態語言。最近本身私人有個項目要作,雖然以前一直 是用java開發,但本身一我的作東西總想找點新鮮有激情的東西玩下,不用考慮團隊知識的問題。因此堅決果斷的選擇用python。由於是個web項目, 因此框架就用django(python的web框架也蠻多,據說web.py很輕量級)。其實學習任何新的東西都是這樣,光看書是沒用的,必定要多動 手,多實踐。好了,不扯了,回答這篇blog的重點上來。 web
django對url和處理的具體代碼的映射是在urls.py裏配置的,以下: 數據庫
urlpatterns = patterns('', url(r'^$', 'mysite.views.home', name='home'), url(r'^mysite/', include('mysite.foo.urls')), url(r'^admin/', include(admin.site.urls)), )
這很好理解。可是靜態文件(css,js)怎麼處理呢?,靜態文件是不須要作上面的映射的。 apache
在要在你的app工程下面新建一個"static"的文件夾,把靜態資源放到些文件夾裏(目錄結構以下圖),就能夠經過http://localhost:8000/static/images/1.jpg訪問了。 django
可是如今有個問題:若是把settings.py配置改下: 瀏覽器
DEBUG=False
|
把DEBUG從True改爲False後就會出現404(必需指定404和500錯語頁面,如上圖的目錄結構)找不到頁面的錯誤。緣由是DEBUG爲 True時django會默認幫咱們處理靜態文件,而爲False的話還須要咱們作點事。在全局usrs.py中加下以下代碼: 服務器
from django.conf import settings if settings.DEBUG is False: urlpatterns += patterns('', url(r'^static/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.STATIC_ROOT, }), )
修改settings.py中的設置:
STATIC_ROOT = 'F:/testweb/static'
以上設置是指定靜態資源的絕對路徑(根據你電腦的具體路徑設置正確值),如今應該能夠正確訪問了。
總結:
標題無「轉載」即原創文章,版權全部。轉載請註明來源:http://besteam.im/blogs/article/77/。
在水木的Python版問了一下,MEDIA_ROOT主要是用來放置上傳的文件。Django的ORM有個特殊的字段叫作FileField是用來存儲文件的。不過實際上並不會把文件內容存到數據庫裏面——由於大多數數據庫保存文件時效率低,而是保存在文件系統裏面。FileField只記錄一個路徑。FileField能夠像個Python的file類型那樣讀寫。
在開發的時候MEDIA_ROOT不該該存聽任何文件。它應該指向一個空的目錄。運行Django的開發服務器時,須要在urls.py裏面加入一個MEDIA_URL的映射,才能正常顯示上傳的內容:
from django.conf import settings if settings.DEBUG: urlpatterns += patterns(", url(r"^media/(?P<path>.*)$", \ "django.views.static.serve", \ {"document_root": settings.MEDIA_ROOT,}), )
當工程被佈署到Apache時也要記得給MEDIA_URL作個映射。
STATIC_ROOT是Django 1.3新增的特性。如同字面上的意思。保存在這個目錄裏面文件被當成靜態文件處理。不過,千萬不要把本身辛苦寫的JavaScript、圖片等靜態文件放到裏面去,接着看下去就知道了。與STATIC_ROOT搭配使用的還有STATIC_URL與STATICFILES_DIRS兩個變量。STATIC_URL通常用默認的/static/,用於指定的靜態目錄的URL。STATICFILES_DIRS則指定一個工程裏面哪一個目錄存放了與這個工程相關的靜態文件,它是一個列表。假定在STATICFILES_DIRS有一個目錄是"/dolphin/besteam/pages/static",其中有一個文件是common.js。那麼,在瀏覽器裏面輸入http://localhost:8000/static/common.js就能夠訪問這個JavaScript文件了。
更深層次的理解,這個東西實際上是用來方便佈署Django App的。考慮一下咱們編寫Django App的狀況,常常會有一些靜態的文件(JavaScript、圖片等)。爲了方便,把這些文件放置到App下面的static目錄裏面。每一個App都有本身的子目錄,因此在Django 1.3以前,佈署的時候就麻煩了。有三種選擇:
一是使用django.views.static.serve來處理文件。在App的urls.py裏面加上一條:
url(r"^(?/static/P<path>.*)$", "django.views.static.serve",\ {"document_root" : "/path/to/project/app/static/"})
每一個App都要加入這條紀錄,這樣作的話,靜態通過了Django的處理,速度太慢。
二是讓用戶手動寫Apache的映射。將/static/映射到/path/to/project/app/static。這種方法更麻煩,不只URL不能衝突,並且破壞了App的代碼獨立原則。做爲佈署者,每一個App的狀況都要至關熟悉,不能遺落(能夠強制每一個App都使用static目錄)。
三是由佈署者將每一個App內的static目錄內的文件複製到一個指定的目錄。而後重寫Apache,將/static映射到這個目錄。這個方案能夠說兼有第一方案與第二方案的優勢,已經接近staticfiles了。缺點是手動操做,仍是太麻煩了一點。
新的Django提供了一個方法自動地將全部的靜態文件放在一塊兒。只要在寫App的時候建立一個static子目錄專門保存靜態文件就好了。在開發階段,沒必要費心去作映射,不須要配置urls.py。在佈署到生產環境的時候,只須要配置Apache把/static/映射到STATIC_ROOT。而後運行manage.py collectstatic,自動地STATICFILES_DIRS列出的目錄以及各個App下的static子目錄的全部文件複製到STATIC_ROOT。由於複製過程可能會覆蓋掉原來的文件,因此,必定不能把咱們辛苦作出來靜態文件放這邊!
在開發階段,Django把/static映射到django.contrib.staticfiles這個App。staticfiles自動地從STATICFILES_DIRS、STATIC_ROOT以及各個App的static子目錄裏面搜索靜態文件。一旦佈署到開發環境上,settings.py不須要從新編寫,只要在Apache的配置文件裏面寫好映射,/static將會被Apache處理。django.contrib.staticfiles雖然仍然存在,但由於不會接收到以/static/開始的路徑,因此將不會產生做用。沒必要擔憂Django會使用處理速度變慢。另外,當settings.DEBUG is False的時候,staticfiles將自動關閉。