2008-12-31 5 views
7

J'ai mis en place une application Django qui utilise des images. Je pense avoir configuré correctement les paramètres de support MEDIA_ROOT et MEDIA_URL. Cependant, les images n'apparaissent pas. Savez-vous quel peut être le problème?Comment Django diffuse-t-il les fichiers multimédias?

Considérons cet exemple:

Les fichiers images sont sous /home/www/media/app/photos et nous essayons de demander http://example.com/photos/123.jpg

Dois-je utiliser ces paramètres?

MEDIA\_ROOT = /home/www/media 

MEDIA_URL = http://example.com/app 

MISE À JOUR: oublié de mentionner que j'utilise le serveur intégré de développement.

Répondre

8

Le service du contenu statique de Django est déconseillé par le développeur lui-même (si je ne me trompe pas, cela ne fonctionne qu'en mode débogage). Vous devriez plutôt utiliser un serveur web dédié. Si vous avez vraiment besoin de faire cela, lisez la documentation sur how to serve static files.

+0

+1: lien vers le doco. –

1

Je suppose que vous obtenez la page Django 404. Essayez d'accéder directement à l'une de vos images et voyez si cela se produit.

Si tel est le cas, votre besoin de configurer votre serveur Web en et non en envoie les demandes dans votre hiérarchie multimédia à Django, mais de les servir directement. Voici un extrait de mon fichier de configuration Apache. La première section dit à Apache d'envoyer tout à Django. La deuxième section a "SetHandler None" qui dit "gérer les choses sous/media de la manière normale."

Voir http://docs.djangoproject.com/en/dev/howto/deployment/modpython/ pour tous les détails passionnants.

fichier partiel httpd.conf pour PrinceOfPinot.com (Alias ​​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> 
11

POUR LE DÉVELOPPEMENT SEULEMENT

Vous pouvez configurer un serveur multimédia statique pour une utilisation avec leur serveur de développement en faisant cela dans votre fichier urls.py. Je joins le code montrant comment je l'utilise (ainsi que les conditionals DEBUG forcés.)

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

Je place mon MEDIA_ROOT dans un sous-répertoire html/médias et un lien vers elle en tant que tel dans settings.py

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/') 

Une fois le développement terminé, le projet est déployé sur le serveur Web où les fichiers multimédias statiques sont ensuite servis par des directives Apache.

+1

Dans vos modèles, comment référencer un fichier CSS ou un fichier image? Dites que vous avez eu votre css à html/media/styles.css. –

0

Je suis conscient que la question initiale est avec le serveur dev, mais pour quelqu'un d'autre qui est à la recherche d'une réponse de l'environnement de production:

https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ fournit un guide sur la façon d'avoir django servir des fichiers dans un environnement de production .De la tonalité du guide, il semble impliquer qu'il est préférable d'avoir un serveur web séparé pour gérer les fichiers ou utiliser mod_wsgi avec Apache

3

Ceci est la manière correcte d'afficher des fichiers image avec ImageField. Imaginez que nous avons une photo de profil d'utilisateur:

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 est le chemin qui les données de téléchargement de l'utilisateur vont. Ceci est sous-répertoire de FULL_PATH_OF_MEDIA, ce qui signifie que le fichier téléchargé aura

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

path.Now complète ce contenu peut être consulté à l'adresse suivante:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD 

Je recommande également la lecture de ce sur static_files vs media_files

doc

Questions connexes