2012-05-02 23 views
5

settings.pyDjango: MEDIA_URL zwraca Page Not Found

# -*- 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 

I urls.py czy to pomaga:

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}), 
) 

Więc w moim szablon {{MEDIA_URL}} {{ p.images}} zwraca prawidłowego URL http://127.0.0.1:8000/site_media/media/products/co_macysLogo3.gif, ale kiedy go otworzyć dostaję Page Not Found.

Plik jest tam, więc nie jestem pewien, dlaczego jest sędzią. Przyjrzałem się 3 lub 4 innym pytaniom na temat SO, które są podobne do moich, ale żadna z ich odpowiedzi nie rozwiązała mojego problemu. Dziwne, że mój {{STATIC_URL}} działa dobrze, ale nie {{MEDIA_URL}}. Oczywiście użyłbym STATIC_URL, gdybym mógł, tylko po to, aby moja aplikacja działała, ale niestety parametr Django ImageField upload_to przesyła tylko obrazy do folderu multimediów.

UPDATE: Zmiana MEDIA_ROOT do MEDIA_ROOT = os.path.join(PROJECT_ROOT, "static") i nazywając mój wizerunek poprzez {{STATIC_URL}} {{}} p.images rozwiązać ten problem. Szkoda, że ​​nie było lepszego sposobu. Nadal nie rozumiem, dlaczego Django nie może działać, aby wyświetlić plik obrazu z MEDIA_URL.

+0

Używasz serwer deweloperski Django, czy coś podobnego nginx? – spinlok

+0

Serwer programistyczny Django. Czemu? Czy miało to znaczenie, gdyby było na Heroku, dotCloud lub EC2? W końcu zostanie wdrożony, um, jak jutro. –

+0

Czy sprawdziłeś mapowanie urls.py? Brzmi bardziej jak widok/brakujący problem dla obsługi. – techiev2

Odpowiedz

5

tylko szybki przykład co działa dla mnie na jednym moich projektach.
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, }), 

modele.py

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

szablon (uproszczony)

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

Dodaj następujący wiersz pod if settings.DEBUG w urls.py

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

Albo ustawić MEDIA_URL = "/media/"

staticfiles służy statycznych plików, do pliku multimedialnego, trzeba podać ścieżkę służąc wyraźnie.

aktualizacja

Przy użyciu pliku backend do przechowywania plików multimedialnych, na przykład ImageField(upload_to='product'), plik o nazwie foo zostanie utworzony w MEDIA_ROOT/product/foo; Adres URL pliku na stronie to MEDIA_URL/product/foo; Na serwerze programistycznym musisz skonfigurować urls.py, aby wyświetlić żądanie dla 'MEDIA_URL/(?<path>.*)$', wewnątrz której znajduje się ścieżka product/foo.

+0

Niestety nie pomogło. –

+0

@ BluePonyInc. spróbuj '^ site-media/media/(? P . *) $ '' – okm

+0

nadal nie ma szczęścia, żeby to zadziałało. –

0

Wzór URL nie jest zgodny z MEDIA_URL. Możesz zmienić MEDIA_URL w swoich ustawieniach na "/ media /", aby dopasować ustawienia swoich adresów URL.

+0

Zrobiłem, ale wciąż nic. –

0

myślę, że to jest prawdziwe i okey

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

potem sprawdzić plik istnieje w tej ścieżce

znaczy, że musi posiada products/co_macysLogo3.gif w ścieżce medialnej

3

Wewnątrz pliku urls.py, trzeba zrobić:

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) 
+0

Cześć {Soumit}, to działało dla mnie. Dzięki wielkie! – arcee123

Powiązane problemy