正如标题所述,我在这里丢失是因为我可以通过网站将文件上传到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
不是?
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)
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
[11/Mar/2014 15:00:43] "GET /media/file.txt HTTP/1.1" 404 1629
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
答案 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)
通过打印配置参数来隔离问题,即:
MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/user/kittens/'
print 'Settings.py MEDIA_ROOT: %s' % (MEDIA_ROOT)
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)
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配置。因此,改变顺序解决了问题。
# 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
。