title: Django: MEDIA_URL returns Page Not Found
body: <p><strong>settings.py</strong></p>
  
  <pre><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 &lt;URL&gt; 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
  </code></pre>
  
  <p>And <strong>urls.py</strong> if it helps:</p>
  
  <pre><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&lt;path&gt;.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
  )
  </code></pre>
  
  <p>So in my template {{ MEDIA_URL }}{{ p.images }} returns the proper URL <strong>http://127.0.0.1:8000/site_media/media/products/co_macysLogo3.gif</strong>, but when I open it I get <em>Page Not Found</em>.</p>
  
  <p>The file is there, so I am not sure why is it complaining. I've looked at 3 or 4 other questions on SO that are similar to mine but none of their answers solved my problem. Strange that my {{STATIC_URL}} works just fine, but the not {{MEDIA_URL}}. I would of course use STATIC_URL if I could, just to get my application to work, but unfortunately Django's ImageField upload_to parameter only uploads images to media folder. </p>
  
  <p><strong>UPDATE:</strong> Changing MEDIA_ROOT to <code>MEDIA_ROOT = os.path.join(PROJECT_ROOT, "static")</code> and calling my image via {{ STATIC_URL }}{{ p.images }} solved the problem. I wish there was a better way. I still don't understand why Django can't freaking serve an image file from MEDIA_URL.</p>