Domanda

Ho installato un'applicazione Django che utilizza immagini. Penso di aver configurato correttamente le impostazioni multimediali MEDIA_ROOT e MEDIA_URL. Tuttavia, le immagini non vengono visualizzate. Sai quale può essere il problema?

Consideriamo questo esempio:

I file di immagine sono in / home / www / media / app / foto e stiamo provando a richiedere http://example.com/photos/123.jpg

Devo usare queste impostazioni?

MEDIA\_ROOT = /home/www/media

MEDIA_URL = http://example.com/app

AGGIORNAMENTO: Hai dimenticato di menzionare che sto usando un server di sviluppo integrato.

È stato utile?

Soluzione

La pubblicazione di contenuti statici da Django è scoraggiata dallo stesso sviluppatore (se non sbaglio, funziona solo in modalità debug). Dovresti invece utilizzare un server web dedicato.

Se hai davvero bisogno di farlo, comunque, leggi la documentazione su come per servire file statici .

Altri suggerimenti

SOLO PER LO SVILUPPO

Puoi configurare un media server statico da usare con il loro server di sviluppo facendo questo nel tuo file urls.py . Ho allegato il codice che mostra come lo uso (insieme ai condizionali DEBUG forzati.)

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

Metto il mio MEDIA_ROOT in una sottodirectory di html / media e mi collego come tale in settings.py

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

Al termine dello sviluppo, il progetto viene distribuito sul server Web in cui i file multimediali statici vengono quindi serviti da Apache usando le direttive.

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

Metto il mio MEDIA_ROOT in una sottodirectory di html / media e mi collego come tale in settings.py

<*>

Al termine dello sviluppo, il progetto viene distribuito sul server Web in cui i file multimediali statici vengono quindi serviti da Apache usando le direttive.

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

Metto il mio MEDIA_ROOT in una sottodirectory di html / media e mi collego come tale in settings.py

<*>

Al termine dello sviluppo, il progetto viene distribuito sul server Web in cui i file multimediali statici vengono quindi serviti da Apache usando le direttive.

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

Metto il mio MEDIA_ROOT in una sottodirectory di html / media e mi collego come tale in settings.py

<*>

Al termine dello sviluppo, il progetto viene distribuito sul server Web in cui i file multimediali statici vengono quindi serviti da Apache usando le direttive.

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

Metto il mio MEDIA_ROOT in una sottodirectory di html / media e mi collego come tale in settings.py

<*>

Al termine dello sviluppo, il progetto viene distribuito sul server Web in cui i file multimediali statici vengono quindi serviti da Apache usando le direttive.

Questo è il modo corretto di mostrare i file di immagine con ImageField. Immagina di avere un'immagine del profilo dell'utente:

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 è il percorso su cui vanno i dati di caricamento dell'utente. Questa è la sottodirectory di FULL_PATH_OF_MEDIA, il che significa che il file caricato avrà

FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD 

percorso completo. Adesso è possibile accedere a questo contenuto a questo URL:

SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD

Consiglio anche di leggere questo su static_files vs media_files

doc

Sospetto che stai ricevendo la pagina Django 404. Prova ad accedere direttamente a una delle tue immagini e vedi se succede.

In tal caso, devi configurare il tuo server web per non inviare richieste all'interno della tua gerarchia multimediale a Django ma invece di servirle direttamente. Ecco un ritaglio dal mio file conf di Apache. La prima sezione dice ad Apache di inviare tutto a Django. La seconda sezione ha " SetHandler Nessuno " che dice "gestisci le cose sotto / media nel modo normale." "

Vedi http://docs.djangoproject.com/en/dev / howto / deployment / modpython / per tutti i dettagli interessanti.

File httpd.conf parziale per PrinceOfPinot.com (pop AKA):

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

Sono consapevole che la domanda originale è con il server dev, ma per chiunque cerchi una risposta per l'ambiente di produzione:

https://docs.djangoproject.com/en/1.8 / howto / static-files / deployment / fornisce una guida su come fare in modo che django serva i file in un ambiente di produzione. Dal tono della guida, sembra implicare che è meglio avere un web server separato per gestire i file o usare mod_wsgi con Apache

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top