Как 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
ОБНОВЛЯТЬ: Забыл упомянуть, что я использую встроенный сервер разработки.
Решение
Обслуживание статического контента из Django обескураженный от самого разработчика (если не ошибаюсь, работает только в режиме отладки).Вместо этого вам следует использовать выделенный веб-сервер.
В любом случае, если вам действительно нужно это сделать, прочтите документацию на как обслуживать статические файлы.
Другие советы
ТОЛЬКО ДЛЯ РАЗРАБОТКИ
Вы можете настроить статический медиа-сервер для использования с их сервером разработки, сделав это в своем 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/media и ссылку на него как таковую в settings.py
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
После завершения разработки проект развертывается на веб-сервере, где статические медиафайлы затем обслуживаются Апач с помощью директив.
Это правильный способ отображения файлов изображений с помощью 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'
URL.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
Я также рекомендую прочитать это на static_files против media_files
Я подозреваю, что вы получаете страницу Django 404.Попробуйте напрямую получить доступ к одному из ваших изображений и посмотрите, происходит ли это.
Если да, то вам необходимо настроить веб-сервер для нет отправлять запросы внутри вашей медиа-иерархии в Django, но вместо этого обслуживать их напрямую.Вот фрагмент моего файла конфигурации Apache.В первом разделе Apache сообщает, что нужно отправить все в Django.Во втором разделе есть «SetHandler None», который говорит «обрабатывать вещи в /media обычным способом».
Видеть http://docs.djangoproject.com/en/dev/howto/deployment/modpython/ обо всех интересных подробностях.
Частичный файл httpd.conf для PrinceOfPinot.com (AKA pop):
<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>
Я знаю, что исходный вопрос касается сервера разработки, но для всех, кто ищет ответ на производственную среду:
https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ предоставляет руководство о том, как использовать файлы django в производственной среде.Судя по тону руководства, это подразумевает, что лучше иметь отдельный веб-сервер для обработки файлов или использовать mod_wsgi с Apache.