Django:MEDIA_URL 返回页面未找到
Posted
技术标签:
【中文标题】Django:MEDIA_URL 返回页面未找到【英文标题】:Django: MEDIA_URL returns Page Not Found 【发布时间】:2012-05-11 14:08:40 【问题描述】:settings.py
# -*- 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", "your_email@domain.com"),
]
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
如果有帮助,urls.py:
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),
)
所以在我的模板 MEDIA_URL p.images 中返回正确的 URL http://127.0.0.1:8000/site_media/media/products/co_macysLogo3.gif,但是当我打开它时,我得到 Page Not Found。
文件在那里,所以我不确定它为什么抱怨。我已经查看了关于 SO 的 3 或 4 个其他问题,这些问题与我的相似,但他们的答案都没有解决我的问题。奇怪的是我的 STATIC_URL 工作得很好,但不是 MEDIA_URL。如果可以的话,我当然会使用 STATIC_URL,只是为了让我的应用程序正常工作,但不幸的是 Django 的 ImageField upload_to 参数只将图像上传到媒体文件夹。
更新:将 MEDIA_ROOT 更改为 MEDIA_ROOT = os.path.join(PROJECT_ROOT, "static")
并通过 STATIC_URL p.images 调用我的图像解决了这个问题。我希望有更好的方法。我仍然不明白为什么 Django 不能从 MEDIA_URL 提供图像文件。
【问题讨论】:
你使用的是 Django 开发服务器,还是 nginx 之类的? Django 开发服务器。为什么?如果它在 Heroku、dotCloud 或 EC2 上会有影响吗?它最终会被部署,嗯,就像明天一样。 你检查你的 urls.py 映射了吗?对我来说,这听起来更像是视图/处理程序丢失的问题。 你的意思是这个 urlpatterns += patterns('', (r'^media/(?P在 urls.py 中的if settings.DEBUG
下添加以下行
(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')
,会在MEDIA_ROOT/product/foo
中创建一个名为foo的文件; page中文件的URL为MEDIA_URL/product/foo
;在开发服务器上,你必须配置urls.py
来服务'MEDIA_URL/(?<path>.*)$'
的请求,其中路径是product/foo
。
【讨论】:
@BluePonyInc.请尝试^site-media/media/(?P<path>.*)$'
@BluePonyInc.嗯..你能发布你的新版本 settings.py 和 url.py 吗?记得把^site-media/media/...
放在^media/...
前面或者直接修改。
@BluePonyInc.使用site_media
而不是site-media
。你MEDIA_URL
是site_media
@BluePonyInc.您当前的配置将尝试访问static/products/co_macysLogo3.gif
以获得http://127.0.0.1:8000/site_media/media/products/co_macysLogo3.gif
。您可以将 gif 文件复制到 static/products/co_macysLogo3.gif
以测试它是否有效
是的,它就像我在问题更新中提到的那样工作,但我必须将 MEDIA_ROOT 指向 /static/。更大的问题是为什么 Django 不识别 /media/ 文件夹?【参考方案2】:
网址格式与您的 MEDIA_URL 不一致。您可以将设置中的 MEDIA_URL 更改为“/media/”以匹配您的 url 设置。
【讨论】:
【参考方案3】:我认为这是真的,没关系
(r'^site-media/(?P<path>.*)$', 'django.views.static.serve', 'document_root': 'media/your/path'),
然后检查您的文件是否存在于此路径中
意味着你必须在媒体路径中有products/co_macysLogo3.gif
【讨论】:
【参考方案4】:只是一个简单的例子,说明在我的一个项目中什么对我有用。 设置.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)
模板(简体)
<img src="object.image.url" >
【讨论】:
【参考方案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)
【讨论】:
以上是关于Django:MEDIA_URL 返回页面未找到的主要内容,如果未能解决你的问题,请参考以下文章
Django MEDIA_URL 返回 https 而不是 http