【问题标题】:Can upload Django media, can't retrieve可以上传 Django 媒体,无法检索
【发布时间】:2014-04-15 07:10:06
【问题描述】:

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

运行服务器输出:

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

世界上到底发生了什么?为什么是“嵌套”媒体 url 路径? 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

【问题讨论】:

  • 为什么file.txt是可执行文件?您是否在删除该属性后尝试过?
  • 这是一个挂载的 NTFS 共享,所以 perms 就这样卡住了。但是,这不是问题,1)从一开始就是配置(当它工作时),2)为了验证我使用 perms rw 将媒体路径移动到本地文件系统,它仍然无法提供文件。
  • MEDIA_ROOT 在我的盒子里是绝对的。我会更新问题以反映这一点。

标签: python django


【解决方案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'

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

【讨论】:

    【解决方案2】:

    根据 django documentation,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)
    

    第二行应该够了..

    【讨论】:

    • 嗨,stackoverflow 今天表现不好,也许你没有看到我的更新。在我的机器上,路径是绝对的。但是,我已经缩小了问题的范围,但我仍然需要帮助。请参阅上面的更新。
    • @TechMedicNYC 哦,现在你编辑了你的问题。您正在 stackoverflow 中更改和调试您的代码,如果您不断更改代码,我们将无能为力。我们不能
    • @TechMedicNYC 您所做的两项更改都有很大的不同,您不能告诉我 MEDIA_ROOT = 'kittens/' 然后它变成 MEDIA_ROOT = '/home/user/kittens/'
    • @TechMedicNYC 你为什么在你的问题中输入错误的代码,为什么不输入实际的配置和代码?
    • 我并不想变得困难,但我不喜欢剪切和粘贴可能是专有代码以供公众查看的内容。因此,我试图简化问题。我认为这可能让你感到沮丧,不是因为我这样做了,而是因为当我深入研究它时,我是这件事的根源。再说一次,我不想变得困难。最初我认为这可能是权限问题。然后我发现了一些服务路径是如何嵌套的。但是当您更改 url 时,它不再是嵌套的。我添加了一些打印语句来尝试和调试。我不知道它为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2016-04-14
    • 2020-11-29
    • 2021-12-12
    • 2019-01-29
    • 2012-10-05
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多