Question

J'ai créé une application Django qui utilise des images. Je pense avoir correctement configuré les paramètres de support MEDIA_ROOT et MEDIA_URL. Cependant, les images n'apparaissent pas. Savez-vous quel peut être le problème?

Considérons cet exemple:

Les fichiers image se trouvent 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

UPDATE: j'ai oublié de mentionner que j'utilise un serveur de développement intégré.

Était-ce utile?

La solution

La fourniture de contenu statique à partir de Django est déconseillée par le développeur lui-même (si je ne me trompe pas, cela ne fonctionne qu'en mode débogage). Utilisez plutôt un serveur Web dédié.

Si vous en avez vraiment besoin, lisez la documentation sur comment pour servir des fichiers statiques .

Autres conseils

POUR LE DÉVELOPPEMENT SEULEMENT

Vous pouvez configurer un serveur de supports statiques à utiliser avec son serveur de développement en le faisant dans votre fichier urls.py . J'ai joint le code indiquant comment je l'utilise (avec les conditions conditionnelles de DEBUG forcées.)

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'^

Je place mon MEDIA_ROOT dans un sous-répertoire de html / media et le lie comme 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 traités par Apache. utilisation de directives.

, 'views.index'), # Accounts (r'^accounts/login/

Je place mon MEDIA_ROOT dans un sous-répertoire de html / media et le lie comme tel dans settings.py

<*>

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

, 'views.user_login'), (r'^accounts/logout/

Je place mon MEDIA_ROOT dans un sous-répertoire de html / media et le lie comme tel dans settings.py

<*>

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

, 'views.user_logout'), # Contrib Modules (r'^admin/(.*)', admin.site.root), ) if settings.DEBUG : urlpatterns += patterns('', (r'^media/(?P<path>.*)

Je place mon MEDIA_ROOT dans un sous-répertoire de html / media et le lie comme tel dans settings.py

<*>

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

, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), )

Je place mon MEDIA_ROOT dans un sous-répertoire de html / media et le lie comme tel dans settings.py

<*>

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

C’est la manière correcte d’afficher des fichiers image avec ImageField. Imaginons que nous ayons une photo de profil 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 d'accès aux données de téléchargement de l'utilisateur. Il s’agit du 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 

chemin complet. Ce contenu est accessible à cette adresse:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD

Je vous recommande également de lire ce document à la static_files vs media_files.

doc

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, vous devez configurer votre serveur Web pour ne pas envoyer de requêtes à Django au sein de votre hiérarchie multimédia, mais pour les servir directement. Voici un extrait de mon fichier de configuration Apache. La première section dit à Apache d'envoyer tout à Django. La seconde section contient "SetHandler None". qui dit "manipule les éléments sous / media de manière normale".

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

Fichier httpd.conf partiel pour 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>

Je suis conscient que la question initiale concerne le serveur de développement, mais pour quiconque cherche un environnement de production, répondez:

https://docs.djangoproject.com/fr/1.8 / howto / static-files / deployment / fournit un guide sur la manière dont django sert des fichiers dans un environnement de production. D'après le ton du guide, cela semble impliquer qu'il est préférable d'avoir un serveur Web séparé pour gérer les fichiers ou d'utiliser mod_wsgi avec Apache

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top