2008-12-31 113 views
7

我已經設置了一個使用圖像的Django應用程序。我想我已經正確設置了媒體設置MEDIA_ROOT和MEDIA_URL。但圖像不顯示。你知道可能是什麼問題嗎?Django如何提供媒體文件?

讓我們考慮這個例子:

的映像文件是在/家庭/網絡/媒體/應用/照片,我們正在試圖請求http://example.com/photos/123.jpg

我應該使用這些設置嗎?

MEDIA\_ROOT = /home/www/media 

MEDIA_URL = http://example.com/app 

UPDATE:忘了提,我使用的是內置的開發服務器。

回答

8

從Django提供靜態內容勸阻從開發者本身(如果我沒有錯,它只在調試模式下工作)。您應該使用專用的Web服務器。

如果您確實需要這樣做,無論如何,請閱讀關於how to serve static files的文檔。

+0

+1:鏈接到doco。 – 2008-12-31 12:17:54

1

我懷疑你正在獲取Django 404頁面。嘗試直接訪問您的圖片之一,看看是否發生。

如果是這樣,您需要配置您的網絡服務器到而不是在您的媒體層次結構中向Django發送請求,而是直接爲它們提供服務。這裏是我的Apache conf文件中的一個片段。第一部分告訴Apache將所有內容發送給Django。第二部分有「SetHandler None」,它表示「以正常方式處理/ media下的內容」。

查看http://docs.djangoproject.com/en/dev/howto/deployment/modpython/瞭解所有令人興奮的細節。對於PrinceOfPinot.com(AKA POP)

部分httpd.conf文件:

<Location "/"> 
    SetHandler python-program 
    PythonAutoReload Off 
    PythonDebug Off 
    PythonPath "['/var/www/production/pop', '/usr/local/lib/python2.5/site-packages/django'] + sys.path" 
    SetEnv DJANGO_SETTINGS_MODULE settings 
    PythonHandler django.core.handlers.modpython 
</Location> 

<Location "/media"> 
    SetHandler None 
    AddOutputFilterByType DEFLATE text/html text/css application/x-javascript 
</Location> 
11

促進發展ONLY

您可以設置與他們的開發服務器使用一個靜態的媒體服務器通過這樣做在你的urls.py文件中。我重視展示如何使用它的代碼(與強制DEBUG條件語句一起。)

from django.conf import settings 
from django.conf.urls.defaults import *  

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    (r'^$', 'views.index'),    

    # Accounts 
    (r'^accounts/login/$', 'views.user_login'), 
    (r'^accounts/logout/$', 'views.user_logout'), 

    # Contrib Modules 
    (r'^admin/(.*)', admin.site.root), 
) 

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

我把我的MEDIA_ROOT在HTML /媒體和鏈接的子目錄它是這樣的settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/') 

開發完成後,該項目將部署到Web服務器,然後使用指令通過Apache爲靜態媒體文件提供服務。

+1

儘管在你的模板中,你會如何引用一個CSS文件或圖像文件?假設你有你的CSS在html/media/styles.css。 – 2009-01-08 11:08:55

0

我知道,原來的問題是開發服務器,但對於其他人誰是尋找一個生產環境答案:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/提供了關於如何有Django的在生產環境中提供文件服務的指南。從指南的口氣,它似乎暗示最好有一個單獨的Web服務器來處理文件或使用mod_wsgi與Apache

3

這是用ImageField顯示圖像文件的正確方法。試想一下,我們有一個用戶的個人資料圖片:

models.py:

UserProfile: 
    profilePic= models.ImageField(upload_to='PATH_TO_UPLOAD', blank=True, null=True) 

settings.py:

MEDIA_ROOT = 'FULL_PATH_OF_MEDIA' 
MEDIA_URL = 'URL_OF_MEDIA' 

urls.py:

urlpatterns = [ 
. 
. 
. 
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

PATH_TO_UPLOAD是其路徑用戶上傳數據。這是FULL_PATH_OF_MEDIA的子目錄,這意味着上傳的文件將有

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

全path.Now這些內容可以在這個網址訪問:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD 

我也建議static_files vs media_files

閱讀本

doc