[英]How does Django serve media files?
我已經設置了一個使用圖像的Django應用程序。 我想我已經正確設置了媒體設置 MEDIA_ROOT 和 MEDIA_URL。 但是圖像不顯示。 你知道可能是什么問題嗎?
讓我們考慮這個例子:
圖像文件位於/home/www/media/app/photos 下,我們正在嘗試請求http://example.com/photos/123.jpg
我應該使用這些設置嗎?
MEDIA\_ROOT = /home/www/media
MEDIA_URL = http://example.com/app
更新:忘了提及我正在使用內置開發服務器。
僅用於開發
您可以通過在urls.py
文件中執行此操作來設置靜態媒體服務器以與他們的開發服務器一起使用。 我附上了顯示我如何使用它的代碼(以及強制調試條件。)
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/media 的子目錄中,並在settings.py
鏈接到它
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
開發完成后,項目被部署到 Web 服務器,然后Apache使用指令提供靜態媒體文件。
開發人員自己不鼓勵從 Django 提供靜態內容(如果我沒記錯的話,它僅在調試模式下才有效)。 您應該改用專用的 Web 服務器。
如果您確實需要這樣做,無論如何,請閱讀有關如何提供靜態文件的文檔。
這是使用 ImageField 顯示圖像文件的正確方法。 假設我們有一張用戶資料圖片:
模型.py:
UserProfile:
profilePic= models.ImageField( upload_to='PATH_TO_UPLOAD', blank=True, null=True)
設置.py:
MEDIA_ROOT = 'FULL_PATH_OF_MEDIA'
MEDIA_URL = 'URL_OF_MEDIA'
網址.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
完整路徑。現在可以通過以下網址訪問此內容:
SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
我還建議在static_files 和 media_files上閱讀這篇文章
您可以將這些行添加到您的 urls.py
from django.urls import re_path
from django.views.static import serve
urlpatterns = [
...
re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
]
我知道最初的問題與開發服務器有關,但對於正在尋找生產環境答案的其他任何人:
https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/提供了有關如何在生產環境中使用 django 服務文件的指南。 從指南的語氣來看,它似乎暗示最好有一個單獨的 Web 服務器來處理文件或將 mod_wsgi 與 Apache 一起使用
我懷疑您正在獲取 Django 404 頁面。 嘗試直接訪問您的圖像之一,看看是否發生了這種情況。
如果是這樣,您需要將 Web 服務器配置為不在媒體層次結構中向 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.