2010-03-16 2 views
2

J'ai lu the article (et quelques autres sur le sujet), mais ne peux toujours pas comprendre comment afficher une image à moins qu'un lien vers un fichier existant sur un Le service Web est codé en dur dans le modèle HTML.ne peut pas figurer servant des images statiques dans l'environnement de développement django

J'ai dans urls.py:

...   
(r'^galleries/(landscapes)/(?P<path>.jpg)$', 
    'django.views.static.serve', {'document_root': settings.MEDIA_URL}), 

... 

où 'paysages' est l'un des albums que je suis en train de montrer les images. (Il y a plusieurs autres d'entre eux.)

Dans views.py appelle le modèle avec le code comme ça:

... 
<li><img src=160.jpg alt='' title='' /></li> 
... 

qui résout le lien d'image en html dans:

http://127.0.0.1:8000/galleries/landscapes/160.jpg 

Dans settings.py Je:

MEDIA_ROOT = 'C:/siteURL/galleries/' 
MEDIA_URL = 'http://some-good-URL/galleries/' 

Dans le système de fichiers il y a un fichier C: /siteURL/galleries/landscapes/160.jpg et j'ai le même fichier http://some-good-URL/galleries/landscapes/160.jpg

Peu importe ce que j'utilise dans urls.py - MEDIA_ROOT ou MEDIA_URL (avec attente d'avoir soit des images locales servi ou du serveur web) - je me suivant dans le code source dans le navigateur:

<li><img src=160.jpg /></li> 

Il n'y a pas d'image affiché dans le navigateur.

Qu'est-ce que je fais mal?

Répondre

10

Ceci est un long article, résumant essentiellement tout ce que j'ai appris sur Django afin de faire fonctionner les fichiers statiques (cela m'a pris du temps pour comprendre comment les différentes parties s'emboîtent).

Pour servir des images statiques dans votre serveur de développement (et plus tard, votre serveur réel), vous allez devoir faire quelques petites choses (remarque en particulier les troisième et quatrième étapes):

Set MEDIA_ROOT

MEDIA_ROOT est une constante qui indique à Django le chemin physique du fichier (sur votre système de fichiers) physique. En utilisant votre exemple, MEDIA_ROOT doit être défini sur 'C:/siteURL/galleries /', comme vous l'avez écrit. MEDIA_ROOT va être utilisé dans l'une des étapes suivantes, c'est pourquoi nous l'avons défini.

Set MEDIA_URL

MEDIA_URL est le "url" à laquelle vos images sont assis. En d'autres termes, chaque fois que vous souhaitez obtenir une image, l'URL à rechercher commence par MEDIA_URL. Habituellement, c'est et non qui commence par "http", puisque vous utilisez votre propre serveur (mon MEDIA_URL est généralement défini sur '/ site_media /', ce qui signifie commencer par le domaine racine, puis aller sur site_media etc.)

utilisez MEDIA_URL

MEDIA_URL ne fonctionne pas par magie, vous avez réellement l'utiliser. Par exemple, lorsque vous écrivez le code HTML qui obtient un fichier, il doit ressembler à ceci:

<li><img src="{{MEDIA_URL}}/160.jpg" /></li> 

Voyez comme je dis le modèle à utiliser le préfixe MEDIA_URL? Cela se traduit finalement à 'http://some-good-URL/galleries/160.jpg'. Notez que pour être en mesure d'utiliser MEDIA_URL dans vos modèles, vous devez ajouter la ligne 'django.core.context_processors.media' à votre paramètre TEMPLATE_CONTEXT_PROCESSORS dans votre fichier settings.py, si je ne me trompe pas.

Faites votre serveur dev servir des fichiers statiques

Dans un environnement réel, vous allez configurer des fichiers avec des adresses comme « static_media » pour être servi sans passer par Django. Mais dans un environnement de dev, vous voulez serveur les de Django, donc vous devez ajouter cette ligne générique à la fin de votre fichier urls.py:

if settings.DEBUG: 
# Serve static files in debug. 
urlpatterns += patterns('', 
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', 
    {'document_root': settings.MEDIA_ROOT, 
    'show_indexes' : True}), 
) 

Notez comment ça prend quoi que ce soit avec l'url "site_media/*" (qui est en fait mon MEDIA_URL) et le sert depuis mon dossier MEDIA_ROOT, qui est l'endroit où le paramètre MEDIA_ROOT entre en jeu.

Note finale

Ce qui me confond est que beaucoup de choses ici sont pour des raisons pratiques. Par exemple, MEDIA_ROOT est uniquement utilisé dans votre modèle d'URL de débogage pour indiquer à Django d'où charger. Et MEDIA_URL est seulement là pour vous encourager à ne pas mettre des URL absolus dans tous vos fichiers HTML, parce que lorsque vous décidez de déplacer les fichiers sur un autre serveur, vous devez les changer tous manuellement (au lieu de changer MEDIA_URL constant). Bien sûr, rien de tout cela n'est nécessaire: vous pouvez coder en dur l'outil de débogage de l'url avec votre propre dossier, assurez-vous que les fichiers statiques sont vraiment serveur de l'url (en le visitant dans votre navigateur), et puis manuellement le sans en utilisant le paramètre MEDIA_URL dans le fichier HTML, juste pour s'assurer que les choses fonctionnent.

5

Cela ressemble bogué ...:

r'^galleries/(landscapes)/(?P<path>.jpg)$' 

ce RE ne correspondent aux noms d'image avec un seul caractère begore le suffixe jpg, pas quatre (comme, par exemple, '160.jpg'). Peut-être que vous vouliez dire ...

r'^galleries/(landscapes)/(?P<path>.*jpg)$' 

...?

+2

encore mieux serait '(? P . + \. (Jpg | png | gif))' – priestc

1

Prenez ceci comme un croisement entre les deux réponses précédentes, qui sont toutes deux bonnes. D'abord, votre regex est incorrecte, comme l'a souligné Alex. Je suggère le définir comme:

(r'^local_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), # static content 

Parce que vous allez probablement vouloir des fichiers serveur css et js, pas seulement des images. Cette regex prend en charge tous les fichiers statiques que vous pourriez vouloir servir.

Ensuite, vous devrez spécifier MEDIA_URL pour vos balises img. Vous avez actuellement:

<img src=160.jpg /> 

Au lieu de cela, il doit être quelque chose comme:

<img src=[YOUR MEDIA_URL]160.jpg /> 

L'astuce que j'utilise est facile. Au sommet de ma views.py, je le code suivant:

from django.conf import settings 
resp = {} 
resp['MEDIA_URL'] = settings.MEDIA_URL 

puis je passe simplement le dictionnaire resp à chaque modèle que je rends. Maintenant, je peux écrire ces mêmes balises img comme:

<img src={{MEDIA_URL}}160.jpg /> 

Le meilleur de tous, cette partie de votre code peut être utilisé dans la production aussi bien (pas les expressions rationnelles, juste le bit MEDIA_URL).

+0

Vous pourriez vouloir utiliser [processeurs de contexte] (https://docs.djangoproject.com/fr/ 1.10/ref/templates/api/# using-requestcontext). – jhrr

Questions connexes