2010-03-16 67 views
2

我讀過the article(和其他幾個關於這個問題),但仍然無法弄清楚如何顯示圖像,除非鏈接到文件存在web服務被硬編碼到html模板中。無法找出在django開發環境中提供靜態圖像

我得在urls.py

...   
(r'^galleries/(landscapes)/(?P<path>.jpg)$', 
    'django.views.static.serve', {'document_root': settings.MEDIA_URL}), 

... 

其中「景觀」是我試圖表現出了圖像上的專輯之一。 (有幾個人。)

views.py用那種代碼調用模板:

... 
<li><img src=160.jpg alt='' title='' /></li> 
... 

來解析HTML圖像鏈接到:

http://127.0.0.1:8000/galleries/landscapes/160.jpg 

settings.py我:

MEDIA_ROOT = 'C:/siteURL/galleries/' 
MEDIA_URL = 'http://some-good-URL/galleries/' 

在文件系統中有一個文件C:/siteURL/galleries/landscapes/160.jpg和我有在http://some-good-URL/galleries/landscapes/160.jpg

相同的文件無論我在urls.py使用 - MEDIA_ROOT或MEDIA_URL(符合預期有無論是本地圖像送達或從Web服務器) - 我獲得以下在瀏覽器的源代碼:

<li><img src=160.jpg /></li> 

沒有在瀏覽器中顯示圖像。

我在做什麼錯?

回答

10

這是一篇很長的文章,基本總結了我學習Django的所有知識,以便讓靜態文件起作用(我花了一段時間才瞭解所有不同部分如何配合)。

要在開發服務器提供靜態圖像(後來,你真正的服務器),你將不得不做一些事情(注意特別是第三步和第四步):

集MEDIA_ROOT

MEDIA_ROOT是一個常量,它告訴Django 物理文件路徑(在您的文件系統上)。使用你的例子,MEDIA_ROOT需要像你寫的那樣設置爲'C:/ siteURL/galleries /'。 MEDIA_ROOT將在以下步驟之一中使用,這就是我們設置它的原因。

集MEDIA_URL

MEDIA_URL是 「URL」 處的圖像坐。換句話說,只要你想得到一個圖像,尋找的網址以 MEDIA_URL開頭。通常這是而不是會以「http」開頭,因爲您從自己的服務器提供服務(我的MEDIA_URL通常設置爲'/ site_media /',這意味着從根域開始,然後轉到site_media等。 )

使用MEDIA_URL

MEDIA_URL不會魔法的工作,你確實有使用它。例如,當你寫它得到一個文件的HTML,它需要像這樣:

<li><img src="{{MEDIA_URL}}/160.jpg" /></li> 

看我怎麼說的是模板的MEDIA_URL前綴?最終轉化爲'http://some-good-URL/galleries/160.jpg'

需要注意的是要能夠在您的模板實際使用MEDIA_URL,你將不得不行'django.core.context_processors.media'添加到您的TEMPLATE_CONTEXT_PROCESSORS設置在你的settings.py文件,如果我沒有記錯。

讓你的dev的服務器提供靜態文件

在實際環境中,您將配置包含「static_media」地址,而不通過Django的要送達的文件。但在開發環境,你會想從Django的服務器他們一樣,所以你應該將這個普通的行添加到您的urls.py文件的末尾:

if settings.DEBUG: 
# Serve static files in debug. 
urlpatterns += patterns('', 
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', 
    {'document_root': settings.MEDIA_ROOT, 
    'show_indexes' : True}), 
) 

請注意如何將採取任何與網址「site_media/*」(實際上是我的MEDIA_URL)並從我的MEDIA_ROOT文件夾提供它,MEDIA_ROOT文件夾是MEDIA_ROOT設置進入的地方。

最後說明

什麼讓我感到困惑的是,這裏的許多東西都是爲了方便。例如,MEDIA_ROOT僅用於調試url模式,以告訴Django從哪裏加載。 MEDIA_URL只是鼓勵你不要在所有HTML文件中輸入絕對URL,因爲當你決定將文件移動到不同的服務器時,你必須手動改變它們(而不是僅僅改變MEDIA_URL不變)。

當然,這些都不是必要的:你可以用你自己的文件夾對debug url patter進行硬編碼,確保靜態文件真的是來自url的服務器(通過在瀏覽器中訪問它),以及然後手動編碼沒有使用MEDIA_URL設置到HTML文件,只是爲了確保工作。

5

這看起來越野車...:

r'^galleries/(landscapes)/(?P<path>.jpg)$' 

這個RE將只與單個字符begore的jpg後綴,而不是四個匹配的圖像名稱(如,例如,'160.jpg')。也許你的意思是...

r'^galleries/(landscapes)/(?P<path>.*jpg)$' 

...?

+2

更好的是'(?P 。+ \。(jpg | png | gif))' – priestc 2010-03-16 01:36:18

1

把這個作爲前兩個答案的交叉點,兩者都很好。首先,Alex指出你的正則表達式是不正確的。我建議將其設置爲:

(r'^local_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), # static content 

因爲你可能會想服務器CSS和JS文件太多,而不僅僅是圖像。這個正則表達式處理你可能想要服務的任何和每個靜態文件。

接下來,您需要爲您的img標籤指定MEDIA_URL。您目前有:

<img src=160.jpg /> 

相反,它需要的是這樣的:

<img src=[YOUR MEDIA_URL]160.jpg /> 

我用的是很容易的伎倆。在我views.py的頂部,我有下面的代碼:

from django.conf import settings 
resp = {} 
resp['MEDIA_URL'] = settings.MEDIA_URL 

,然後我就通過RESP字典,每個模板我渲染。現在我可以寫那些相同的img標籤爲:

<img src={{MEDIA_URL}}160.jpg /> 

最重要的是,你的這部分代碼可以在生產中使用,以及(不是正則表達式,只是MEDIA_URL位)。

+0

您可能想使用[上下文處理器](https://docs.djangoproject.com/en/ 1.10/REF /模板/ API /#使用-的RequestContext)。 – jhrr 2016-11-18 19:46:31

相關問題