简体   繁体   English

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

[英]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. 最令人讨厌的部分是,这种情况已经存在了很长时间,现在发生了一些变化而且它已经破裂。

UPDATE: I've narrowed the problem down. 更新:我把问题缩小了。

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不是?

urls.py 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 settings.py

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

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

On the disk 在磁盘上

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*

In the browser 在浏览器中

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

"file.txt" does not exist

python manage.py runserver python manage.py runserver

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

python manage.py shell 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

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: 通过打印配置参数来隔离问题,即:

settings.py settings.py

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

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

urls.py 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 python manage.py runserver

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. 因此,改变顺序修复了问题。

settings.py 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'

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM