Wie funktioniert Django Mediendateien dienen?
Frage
Ich habe eine Django Anwendung einrichten, die Bilder verwendet. Ich glaube, ich habe die Medieneinstellungen MEDIA_ROOT und MEDIA_URL richtig eingerichtet ist. Doch die Bilder zeigen, nicht auf. Wissen Sie, was das Problem sein kann?
Lassen Sie dieses Beispiel betrachten:
Die Bilddateien sind unter / home / www / media / app / Fotos und wir versuchen, a href = anfordern < "http://example.com/photos/123.jpg" rel = "noreferrer"> http://example.com/photos/123.jpg
Soll ich diese Einstellungen?
MEDIA\_ROOT = /home/www/media
MEDIA_URL = http://example.com/app
UPDATE:. vergessen zu erwähnen, dass ich Built-in bin mit Entwicklungs-Server
Lösung
statischen Inhalt von Django ist entmutigt vom Entwickler selbst (wenn ich mich nicht falsch, es funktioniert nur, wenn im Debug-Modus). Sie sollten einen eigenen Web-Server verwenden, statt.
Wenn Sie wirklich tun müssen, wie auch immer, lesen Sie die Dokumentation auf wie dienen statische Dateien .
Andere Tipps
ENTWICKLUNGS ONLY
Sie können Setup einen statischen Medienservers für die Verwendung mit dem Entwicklungs-Server durch diese Datei in Ihrem urls.py
tun. Ich habe den Code angebracht zeigt, wie ich es verwenden (zusammen mit dem Zwang DEBUG conditionals.)
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}),
)
ich meine MEDIA_ROOT
in einem Unterverzeichnis html / Medien und Link, um es als solche in settings.py
platzieren
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
Nach der Entwicklung abgeschlossen ist, wird das Projekt auf den Web-Server eingesetzt, wo statische Mediendateien dann bedient werden von Apache mit Richtlinien.
Dies ist der richtige Weg, Bilddateien mit Imagefield zeigen. Stell dir vor, wir ein Benutzerprofil Bild haben:
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 ist der Weg, den Benutzer Upload-Daten geht. Dies ist das Unterverzeichnis von FULL_PATH_OF_MEDIA, das heißt die hochgeladene Datei hat
FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD
full path.Now dieser Inhalt kann unter folgenden URL abgerufen werden:
SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
Ich empfehle auch das Lesen auf static_files vs media_files
Ich vermute, dass Sie die Django 404 Seite bekommen. Versuchen Sie direkten Zugriff auf eines Ihrer Bilder und sehen, ob das passiert.
Wenn ja, um Ihr Bedarf zu Ihrem Web-Server zu konfigurieren nicht Bitte senden Sie Anfragen innerhalb Ihrer Medienhierarchie Django sondern stattdessen dient sie direkt. Hier ist ein Schnipsel aus meiner Apache conf-Datei. Der erste Abschnitt weist Apache alles Django zu senden. Der zweite Abschnitt hat „SetHandler None“, das besagt, „Sachen unter / media in gewohnter Weise handhaben.“
Siehe http://docs.djangoproject.com/en/dev / Howto / deployment / Mod_python / für alle spannenden Details.
Teil httpd.conf für 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>
Ich bin mir bewusst, dass die ursprüngliche Frage mit dem Dev-Server ist, sondern auch für alle anderen, die für eine Produktionsumgebung Antwort sucht:
https://docs.djangoproject.com/en/1.8 / Howto / statisch-Dateien / deployment / bietet eine Anleitung, wie man Dateien in einer Produktionsumgebung haben django dienen. Aus dem Ton der Führung, scheint es zu bedeuten, dass es am besten ist, einen separaten Web-Server haben Sie die Dateien oder verwenden mod_wsgi mit Apache
zu handhaben