Como é que Django servir arquivos de mídia?
Pergunta
Eu criaram uma href="http://en.wikipedia.org/wiki/Django_%28web_framework%29" rel="noreferrer"> aplicação que as imagens usos. Eu acho que criaram a mídia configurações MEDIA_ROOT e MEDIA_URL corretamente. No entanto, as imagens não aparecem. Você sabe o que pode ser o problema?
Let considere este exemplo:
Os arquivos de imagem estão sob / home / www / media / app / photos e estamos tentando pedido http://example.com/photos/123.jpg
Devo usar essas configurações?
MEDIA\_ROOT = /home/www/media
MEDIA_URL = http://example.com/app
UPDATE:. Esqueceu-se de mencionar que eu estou usando built-in servidor de desenvolvimento
Solução
servir conteúdo estático de Django é desencorajado do-se colaborador (se não me engano, ele só funciona quando está no modo de depuração). Você deve usar um servidor web dedicado, em vez disso.
Se você realmente precisar fazer isso, de qualquer maneira, leia a documentação on como para servir arquivos estáticos .
Outras dicas
PARA O DESENVOLVIMENTO SOMENTE
Você pode configurar um servidor de mídia estática para uso com o seu servidor de desenvolvimento, fazendo isso em seu arquivo urls.py
. Anexei o código mostrando como eu usá-lo (juntamente com os condicionais DEBUG forçadas.)
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}),
)
Eu coloco minha MEDIA_ROOT
em um subdiretório do HTML / mídia e link para ele como tal no settings.py
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'html/media/').replace('\\','/')
Após o desenvolvimento estiver concluído, o projeto é implantado no servidor web onde os arquivos de mídia estáticos são então servido por Apache usando directivas.
Esta é a maneira correta de mostrar arquivos de imagem com ImageField. Imagine que temos uma imagem no perfil de usuário:
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 é o caminho que os dados do usuário de upload vai. Esta é sub-diretório de FULL_PATH_OF_MEDIA, o que significa que o arquivo carregado terá
FULL_PATH_OF_MEDIA/PATH_TO_UPLOAD
path.Now completa este conteúdo pode ser acessado no endereço:
SITE_NAME/URL_OF_MEDIA/PATH_TO_UPLOAD
Eu também recomendo a leitura deste on static_files vs media_files
Eu suspeito que você está recebendo a página Django 404. Tente acessar diretamente uma das suas imagens e ver se o que está acontecendo.
Se assim for, a sua necessidade de configurar seu servidor web para não pedidos de envio dentro de sua hierarquia de mídia para Django, mas em vez disso, servi-los diretamente. Aqui está um recorte do meu arquivo conf Apache. A primeira seção diz Apache para enviar tudo para Django. A segunda seção tem "SetHandler Nenhum" que diz "coisas alça sob / media na forma normal."
http://docs.djangoproject.com/en/dev / howto / implantação / versão ModPython / para todos os detalhes excitantes.
arquivo httpd.conf parcial para 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>
Estou ciente de que a pergunta original é com o servidor dev, mas para qualquer pessoa que está à procura de uma resposta ambiente de produção:
https://docs.djangoproject.com/en/1.8 / howto / static-files / implantação / fornece um guia sobre como ter Django servir arquivos em um ambiente de produção. Pelo tom do guia, parece implicar que o melhor é ter um servidor web separado para lidar com a arquivos ou usar mod_wsgi com Apache