可以上传Django媒体,无法检索

时间:2014-03-11 15:08:50

标签: python django

正如标题所述,我在这里丢失是因为我可以通过网站将文件上传到MEDIA_ROOT,但是当我尝试提供它们时,我收到404错误。最令人讨厌的部分是,这种情况已经存在了很长时间,现在发生了变化而且已经破裂了。

更新:我已将问题缩小了。

如果我改变: MEDIA_URL = '/media/'

Django在http://192.168.xxx.xxx/media/media/file.txt

提供文件

如果我改变: MEDIA_URL = '/kittens/'

Django在http://192.168.xxx.xxx/kittens/file.txt

提供文件

runserver输出:

urls.py MEDIA_URL: /media/
urls.py MEDIA_ROOT:
Settings.py MEDIA_ROOT: /home/user/kittens/

世界上发生了什么?为什么"嵌套"媒体网址路径? django.conf.settings.MEDIA_ROOT是空白而mysite.settings.MEDIA_ROOT不是?

urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

print 'urls.py MEDIA_URL: %s' % (settings.MEDIA_URL)
print 'urls.py MEDIA_ROOT: %s' % (settings.MEDIA_ROOT)

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/user/kittens/'

print 'Settings.py MEDIA_ROOT: %s' % (MEDIA_ROOT)

在磁盘上

drwxr-xr-x 0 user user     0 Mar 11 11:00 kittens/
-rwxr-xr-x 0 user user 22561 Oct  5 19:17 kittens/file.txt*

在浏览器中

Page not found (404)
Request Method:     GET
Request URL:    http://192.168.../media/file.txt

"file.txt" does not exist

python manage.py runserver

[11/Mar/2014 15:00:43] "GET /media/file.txt HTTP/1.1" 404 1629

python manage.py shell

IPython 1.1.0 -- An enhanced Interactive Python.

In [1]: from django.conf import settings

In [2]: settings.MEDIA_ROOT
Out[2]: 'kittens/'

In [3]: settings.MEDIA_URL
Out[3]: '/media/'

In [8]: os.path.join(settings.MEDIA_ROOT, 'file.txt')
Out[8]: 'kittens/file.txt'

In [9]: os.path.exists(os.path.join(settings.MEDIA_ROOT, 'file.txt'))
Out[9]: True

2 个答案:

答案 0 :(得分:1)

根据django documentation,MEDIA_ROOT 必须 为绝对路径:

  

MEDIA_ROOT

     

默认:'' (空字符串)

     

将保存用户上传的目录的绝对文件系统路径   文件。

     

示例:" /var/www/example.com/media /"

因此,如果您希望将媒体放在项目中,那么您的配置应该是这样的:

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'kittens/')

或绝对路径:

MEDIA_ROOT = /user/uploaded/files/kittens/

修改 由于您更新了上述问题,因此答案无关紧要。但我可以看到你的url配置问题,你配置媒体路径两次:

url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

第二行应该足够了..

答案 1 :(得分:1)

通过打印配置参数来隔离问题,即:

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/user/kittens/'

print 'Settings.py MEDIA_ROOT: %s' % (MEDIA_ROOT)

urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

print 'urls.py MEDIA_URL: %s' % (settings.MEDIA_URL)
print 'urls.py MEDIA_ROOT: %s' % (settings.MEDIA_ROOT)

python manage.py runserver

urls.py MEDIA_URL: /media/
urls.py MEDIA_ROOT:
Settings.py MEDIA_ROOT: /home/user/kittens
Validating models...

您会注意到urls.py MEDIA_ROOT为空。检查settings.py后,我注意到在配置MEDIA_ROOT之前调用了根URL配置。因此,改变顺序解决了问题。

settings.py

# Must specify MEDIA_ROOT first so urls.py picks it up via django.conf.settings
MEDIA_ROOT = '/home/user/kittens'
# Then call site root's urls.py
ROOT_URLCONF = 'mysite.urls'

我不知道 这是如何导致&#34;嵌套&#34;媒体路径,但改变确实解决了它。也就是说,我可以导航到http://192.168.xxx.xxx/media/file.txt