Как 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

doc


Я подозреваю, что вы получаете страницу 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