Как Django обслуживает медиа-файлы? - PullRequest
10 голосов
/ 31 декабря 2008

Я установил 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

ОБНОВЛЕНИЕ: Забыл упомянуть, что я использую встроенный сервер разработки.

Ответы [ 5 ]

12 голосов
/ 01 января 2009

ТОЛЬКО ДЛЯ РАЗРАБОТКИ

Вы можете настроить статический медиа-сервер для использования с их сервером разработки, выполнив это в файле 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('\\','/')

После завершения разработки проект развертывается на веб-сервере, где статические медиа-файлы затем обслуживаются Apache с использованием директив.

12 голосов
/ 31 декабря 2008

Обслуживание статического контента из Django не рекомендуется от самих разработчиков (если я не ошибаюсь, это работает только в режиме отладки). Вместо этого вы должны использовать выделенный веб-сервер.

Если вам действительно нужно это сделать, в любом случае, прочитайте документацию по , как обслуживать статические файлы .

4 голосов
/ 02 апреля 2016

Это правильный способ отображения файлов изображений с помощью 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 

полный путь. Теперь этот контент доступен по этому адресу:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD

Я также рекомендую прочитать это на static_files vs media_files

документ

1 голос
/ 12 ноября 2015

Мне известно, что оригинальный вопрос относится к серверу разработки, но для всех, кто ищет ответ на производственную среду:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ содержит руководство о том, как django обслуживать файлы в производственной среде. Судя по тону руководства, кажется, что для обработки файлов лучше иметь отдельный веб-сервер или использовать mod_wsgi с Apache

1 голос
/ 31 декабря 2008

Я подозреваю, что вы получаете страницу 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...