Как Django обслуживает медиа-файлы?
Я создал Джанго приложение, которое использует образы. Я думаю, что я правильно настроил Настройки Мультимедиа MEDIA_ROOT и MEDIA_URL. Однако изображения не отображаются. Знаешь, в чем может быть проблема?
рассмотрим этот пример:
файлы изображений находятся под / главная / www / медиа / приложение / Фотографии и мы пытаемся запросить http://example.com/photos/123.jpg
должен ли я использовать эти настройки?
MEDIA_ROOT = /home/www/media
MEDIA_URL = http://example.com/app
обновление: забыл упомянуть, что я использую встроенный сервер разработки.
5 ответов
обслуживание статического контента из Django-это уныние от самих разработчиков (если я не ошибаюсь, он работает только в режиме отладки). Вместо этого следует использовать выделенный веб-сервер.
Если вам действительно нужно это сделать, в любом случае, прочитайте документацию на как обслуживать статические файлы.
ТОЛЬКО ДЛЯ РАЗВИТИЯ
вы можете настроить статический медиа-сервер для использования с их сервером разработки, сделав это в своем . Я прикрепил код, показывающий, как я его использую (вместе с принудительными условиями отладки.)
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('\','/')
после завершения разработки проект развертывается на веб-сервере, где статический медиа-файлы затем обслуживаются Apache С помощью директив.
это правильный способ отображения файлов изображений с помощью 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
полный путь.Теперь этот контент можно получить по этому url:
SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
I Также рекомендуем прочитать это на static_files vs media_files
Я подозреваю, что вы получаете страницу Django 404. Попробуйте получить прямой доступ к одному из ваших изображений и посмотреть, если это происходит.
Если это так, то нужно настроить свой веб-сервер не отправлять запросы в вашей иерархии мультимедиа в Django, но вместо этого обслуживать их напрямую. Вот отрывок из моего файла Apache conf. В первом разделе говорится, что Apache отправляет все в Django. Во втором разделе есть "SetHandler None", в котором говорится: "обрабатывать материал под /media в обычном режиме путь."
см.http://docs.djangoproject.com/en/dev/howto/deployment/modpython/ для всех захватывающих деталей.
частичный httpd.файл conf для PrinceOfPinot.com (АКА поп):
<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>
Я знаю, что исходный вопрос связан с dev-сервером, но для всех, кто ищет ответ на рабочую среду:
https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ предоставляет руководство о том, как использовать файлы django в производственной среде. Из тона руководства, похоже, следует, что лучше иметь отдельный веб-сервер для обработки файлов или использовать mod_wsgi с Apache