[英]Can upload Django media, can't retrieve
As the title states, I am lost here because I can upload files to MEDIA_ROOT via the site, but when I attempt to serve them I get a 404 error. 正如标题所述,我在这里丢失是因为我可以通过网站将文件上传到MEDIA_ROOT,但是当我尝试为它们提供服务时,我收到了404错误。 The most annoying part is that this worked for ages, now something changed and it's broken.
最令人讨厌的部分是,这种情况已经存在了很长时间,现在发生了一些变化而且它已经破裂。
If I change: MEDIA_URL = '/media/'
如果我改变:
MEDIA_URL = '/media/'
Django serves the file at http://192.168.xxx.xxx/media/media/file.txt
Django在
http://192.168.xxx.xxx/media/media/file.txt
提供该文件
If I change: MEDIA_URL = '/kittens/'
如果我改变:
MEDIA_URL = '/kittens/'
Django serves the file at http://192.168.xxx.xxx/kittens/file.txt
Django在
http://192.168.xxx.xxx/kittens/file.txt
提供该文件
runserver output: runserver输出:
urls.py MEDIA_URL: /media/
urls.py MEDIA_ROOT:
Settings.py MEDIA_ROOT: /home/user/kittens/
What in the world is going on? 世界上到底发生了什么? Why the "nested" media url path?
为什么“嵌套”媒体网址路径?
django.conf.settings.MEDIA_ROOT
is blank while mysite.settings.MEDIA_ROOT
is not? 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
As per django documentation , MEDIA_ROOT must be absolute path: 根据django 文档 ,MEDIA_ROOT 必须是绝对路径:
MEDIA_ROOT
MEDIA_ROOT
Default: '' (Empty string)
默认值:''(空字符串)
Absolute filesystem path to the directory that will hold user-uploaded files.
用于保存用户上载文件的目录的绝对文件系统路径。
Example: "/var/www/example.com/media/"
示例:“/ var / www / example / media /”
So your configuration should be something like this if you want media to be inside your project: 因此,如果您希望将媒体放在项目中,那么您的配置应该是这样的:
MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'kittens/')
or an absolute path: 或绝对路径:
MEDIA_ROOT = /user/uploaded/files/kittens/
Edit: Since you updated your question above answer is not relevant. 编辑:由于您更新了上述问题,因此答案无关紧要。 But I can see problem with your url config where you configure the media path twice:
但我可以看到你的url配置问题,你配置媒体路径两次:
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
the second line should be enough.. 第二行应该够了..
The problem was isolated by printing the configuration parameters, ie: 通过打印配置参数来隔离问题,即:
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...
You'll notice the urls.py
MEDIA_ROOT
is blank. 你会注意到
urls.py
MEDIA_ROOT
是空白的。 After inspecting settings.py
I noticed that the root url configuration was being called before MEDIA_ROOT
was configured. 检查
settings.py
我注意到在配置MEDIA_ROOT
之前调用了根URL配置。 Therefore, changing the order fixed the problem. 因此,改变顺序修复了问题。
# 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'
I don't know how this caused the "nested" media path, but the change did fix it regardless. 我不知道这是如何导致“嵌套”媒体路径的,但是无论如何变化确实解决了这个问题。 That is, I can navigate to
http://192.168.xxx.xxx/media/file.txt
. 也就是说,我可以导航到
http://192.168.xxx.xxx/media/file.txt
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.