可以上传Django媒体,无法重试

2024-05-29 08:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所述,我在这里迷失了,因为我可以通过站点将文件上传到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/

到底是怎么回事?为什么是“嵌套”媒体url路径?django.conf.settings.MEDIA_ROOT为空,而{}不是?在

在网址.py在

^{pr2}$

在设置.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管理运行服务器

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

Python管理贝壳

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

Tags: 文件inpytxthttpurlsettingsroot
2条回答

根据djangodocumentation,媒体根必须是绝对路径:

MEDIA_ROOT

Default: '' (Empty string)

Absolute filesystem path to the directory that will hold user-uploaded files.

Example: "/var/www/example.com/media/"

因此,如果您希望媒体在项目中,您的配置应该如下所示:

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

或绝对路径:

^{pr2}$

编辑: 既然你更新了你的问题,上面的答案就不相关了。但是我发现你的url配置有问题,你配置了两次媒体路径:

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

第二行就够了。。在

通过打印配置参数,即:

在设置.py在

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

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

在网址.py在

^{pr2}$

Python管理.py运行服务器

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

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

在设置.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'

我不知道这是如何导致“嵌套”媒体路径的,但是不管怎样,这个改变确实修复了它。也就是说,我可以导航到http://192.168.xxx.xxx/media/file.txt。在

相关问题 更多 >

    热门问题