Вопрос по python – Django: MEDIA_URL возвращает страницу не найдена

6

settings.py

<code># -*- coding: utf-8 -*-
# Django settings for basic pinax project.

import os.path
import posixpath

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))

DEBUG = True
TEMPLATE_DEBUG = DEBUG

# tells Pinax to serve media through the staticfiles app.
SERVE_MEDIA = DEBUG

# django-compressor is turned off by default due to deployment overhead for
# most users. See <URL> for more information
COMPRESS = False

INTERNAL_IPS = [
    "127.0.0.1",
]

ADMINS = [
    # ("Your Name", "[email protected]"),
]

MANAGERS = ADMINS

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3", # Add "postgresql_psycopg2", "postgresql", "mysql", "sqlite3" or "oracle".
        "NAME": "dev.db",                       # Or path to database file if using sqlite3.
        "USER": "",                             # Not used with sqlite3.
        "PASSWORD": "",                         # Not used with sqlite3.
        "HOST": "",                             # Set to empty string for localhost. Not used with sqlite3.
        "PORT": "",                             # Set to empty string for default. Not used with sqlite3.
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = "US/Eastern"

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = "en-us"

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.join(PROJECT_ROOT, "static")

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = "/site_media/media/"

# Absolute path to the directory that holds static files like app media.
# Example: "/home/media/media.lawrence.com/apps/"
STATIC_ROOT = os.path.join(PROJECT_ROOT, "site_media", "static")

# URL that handles the static files like app media.
# Example: "http://media.lawrence.com"
STATIC_URL = "/site_media/static/"

# Additional directories which hold static files
STATICFILES_DIRS = [
    os.path.join(PROJECT_ROOT, "static"),
    os.path.join(PROJECT_ROOT, "media"),
]

STATICFILES_FINDERS = [
    "staticfiles.finders.FileSystemFinder",
    "staticfiles.finders.AppDirectoriesFinder",
    "staticfiles.finders.LegacyAppDirectoriesFinder",
    "compressor.finders.CompressorFinder",
]

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = posixpath.join(STATIC_URL, "admin/")

# Subdirectory of COMPRESS_ROOT to store the cached media files in
COMPRESS_OUTPUT_DIR = "cache"

# Make this unique, and don't share it with anybody.
SECRET_KEY = "HIDDEN"

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = [
    "django.template.loaders.filesystem.load_template_source",
    "django.template.loaders.app_directories.load_template_source",
]

MIDDLEWARE_CLASSES = [
    "django.middleware.common.CommonMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django_openid.consumer.SessionConsumer",
    "django.contrib.messages.middleware.MessageMiddleware",
    "pinax.apps.account.middleware.LocaleMiddleware",
    "pagination.middleware.PaginationMiddleware",
    "pinax.middleware.security.HideSensistiveFieldsMiddleware",
    "debug_toolbar.middleware.DebugToolbarMiddleware",
]

ROOT_URLCONF = "ezstyler.urls"

TEMPLATE_DIRS = [
    os.path.join(PROJECT_ROOT, "templates"),
]

TEMPLATE_CONTEXT_PROCESSORS = [
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
    "django.contrib.messages.context_processors.messages",

    "staticfiles.context_processors.static",

    "pinax.core.context_processors.pinax_settings",

    "pinax.apps.account.context_processors.account",

    "notification.context_processors.notification",
    "announcements.context_processors.site_wide_announcements",
]

INSTALLED_APPS = [
    # Django
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.sites",
    "django.contrib.messages",
    "django.contrib.humanize",

    "pinax.templatetags",

    # theme
    "pinax_theme_foundation",

    # external
    "notification", # must be first
    "staticfiles",
    "compressor",
    "debug_toolbar",
    "mailer",
    "django_openid",
    "timezones",
    "emailconfirmation",
    "announcements",
    "pagination",
    "idios",
    "metron",

    # Pinax
    "pinax.apps.account",
    "pinax.apps.signup_codes",

    # project
    "about",
    "profiles",
    "outfits",
]

FIXTURE_DIRS = [
    os.path.join(PROJECT_ROOT, "fixtures"),
]

MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage"

EMAIL_BACKEND = "mailer.backend.DbBackend"

ABSOLUTE_URL_OVERRIDES = {
    "auth.user": lambda o: "/profiles/profile/%s/" % o.username,
}

AUTH_PROFILE_MODULE = "profiles.Profile"
NOTIFICATION_LANGUAGE_MODULE = "account.Account"

ACCOUNT_OPEN_SIGNUP = True
ACCOUNT_USE_OPENID = False
ACCOUNT_REQUIRED_EMAIL = False
ACCOUNT_EMAIL_VERIFICATION = False
ACCOUNT_EMAIL_AUTHENTICATION = False
ACCOUNT_UNIQUE_EMAIL = EMAIL_CONFIRMATION_UNIQUE_EMAIL = False

AUTHENTICATION_BACKENDS = [
    "pinax.apps.account.auth_backends.AuthenticationBackend",
]

LOGIN_URL = "/account/login/" # @@@ any way this can be a url name?
LOGIN_REDIRECT_URLNAME = "what_next"
LOGOUT_REDIRECT_URLNAME = "home"

EMAIL_CONFIRMATION_DAYS = 2
EMAIL_DEBUG = DEBUG

DEBUG_TOOLBAR_CONFIG = {
    "INTERCEPT_REDIRECTS": False,
}

# local_settings.py can be used to override environment-specific settings
# like database and email that differ between development and production.
try:
    from local_settings import *
except ImportError:
    pass
</code>

А такжеurls.py если это поможет:

<code>from django.conf.urls.defaults import *
from outfits.views import *
import settings

urlpatterns = patterns("",
    # Outfits
    url(r'^$', outfit_list, name='outfit_list'),
    url(r'^new/$', outfit_create, name='outfit_create'),
    url(r'^detail/(\d+)/$', outfit_detail, name='outfit_detail'),
    url(r'^update/(\d+)/$', outfit_update, name='outfit_update'),
    url(r'^delete/(\d+)/$', outfit_delete, name='outfit_delete'),
    # Products
    url(r'^detail/(\d+)/add/confirm/$', product_confirm, name='product_confirm'),
    url(r'^outfit_displayImg/$', outfits_displayImg),
    url(r'^detail/(\d+)/add/$', product_add, name='product_add'),
    url(r'^detail/(\d+)/update/(\d+)$', product_update, name='product_update'),
    url(r'^detail/(\d+)/delete/(\d+)$', product_delete, name='product_delete'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^site_media/media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
)
</code>

Так что в моем шаблоне {{MEDIA_URL}} {{p.images}} возвращает правильный URLhttp://127.0.0.1:8000/site_media/media/products/co_macysLogo3.gif, но когда я открываю его, я получаюPage Not Found.

Файл там, так что я не уверен, почему он жалуется. Я рассмотрел 3 или 4 других вопроса о SO, которые похожи на мои, но ни один из их ответов не решил мою проблему. Странно, что мой {{STATIC_URL}} работает просто отлично, но не {{MEDIA_URL}}. Конечно, я бы использовал STATIC_URL, если бы мог, просто для того, чтобы заставить мое приложение работать, но, к сожалению, параметр Django ImageField upload_to загружает только изображения в папку мультимедиа.

UPDATE: Изменение MEDIA_ROOT наMEDIA_ROOT = os.path.join(PROJECT_ROOT, "static") и вызов моего изображения через {{STATIC_URL}} {{p.images}} решил проблему. Я бы хотел, чтобы был лучший способ. Я до сих пор не понимаю, почему Django не может использовать файл изображения из MEDIA_URL.

Вы имеете в виду этот шаблон urlpatterns + = ('', '', (r '; ^ media / (? P & lt; path & gt;. *) $ "", " settings.MEDIA_ROOT, "show_indexes": True}),)? Да, у меня есть это. Sahat Yalkabov
Вы используете сервер разработки Django, или что-то вроде nginx? spinlok
Сервер разработки Django. Зачем? Будет ли это иметь значение, если это было на Heroku, dotCloud или EC2? Это будет в конечном итоге развернуто, как завтра. Sahat Yalkabov
Вы проверили свое отображение urls.py? Для меня это больше похоже на проблему с отсутствующим представлением / обработчиком. techiev2
Вы запускали ./manage.py collectstatic? Тогда, возможно, используйте {{STATIC_URL}} в шаблоне. mtnpaul

Ваш Ответ

5   ответов
6

что работает для меня в одном из моих проектов.
Settings.py

MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'site_media', 'media')
MEDIA_URL = '/site_media/media/'
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'site_media', 'static')
SITE_MEDIA_URL = '/site_media/'
STATIC_URL = '/site_media/'
ADMIN_TOOLS_MEDIA_URL = '/site_media/'
ADMIN_MEDIA_PREFIX = posixpath.join(STATIC_URL, "admin/")
STATICFILES_DIRS = (os.path.join(PROJECT_ROOT, 'site_media'),)

Urls.py

if settings.SERVE_MEDIA:
    urlpatterns += patterns("",
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.STATIC_ROOT, 'show_indexes': True }),
        (r'^static/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.STATIC_ROOT, }),

Models.py

image = ImageField(upload_to='products/product_type', blank=True, null=True)

template (упрощенно)

<img src="{{object.image.url}}" >
7

Добавьте следующую строку подif settings.DEBUG в urls.py

(r'^site-media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes':True}),

Или поставьMEDIA_URL = "/media/"

staticfiles служит для статических файлов, для медиафайлов вы должны явно указать путь к серверу.

Обновит

При использовании файлового бэкенда для хранения медиафайлов, напримерImageField(upload_to='product'), файл с именем foo будет создан вMEDIA_ROOT/product/foo; URL-адрес файла на странице являетсяMEDIA_URL/product/foo; На сервере разработки, вы должны con, рисurls.py обработать запрос на'MEDIA_URL/(?<path>.*)$', внутри которого путьproduct/foo.

@ BluePonyInc. пожалуйста, попробуй^site-media/media/(?P<path>.*)$' okm
пока не получится заставить его работать. Sahat Yalkabov
К сожалению, не помогло. Sahat Yalkabov
@ BluePonyInc. хм .. вы можете опубликовать новую версию settings.py и url.py? не забудьте поставить^site-media/media/... строка перед^media/... line или напрямую измените его. okm
@ BluePonyInc. использоватьsite_media вместо тогоsite-media. ВыMEDIA_URL являетсяsite_media okm
5

Внутри твоегоurls.py файл, нужно сделать:

from django.conf import settings
from django.conf.urls.static import static


if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Привет @Сумит, это сработало для меня. Спасибо большое arcee123
0

_URL в своих настройках на "/ media /", чтобы они соответствовали вашим настройкам URL.

Я сделал, но все еще ничего. Sahat Yalkabov
0

Я думаю, что это правда и хорошо

(r'^site-media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media/your/path'}),

после этой проверки ваш файл существует по этому пути

значит у тебя должно бытьproducts/co_macysLogo3.gif в медиа-пути

Похожие вопросы