django 媒体路径问题

1 投票
2 回答
762 浏览
提问于 2025-04-17 00:10

我在使用Django的时候遇到了一些关于媒体路径的问题。在settings.py文件里,我设置了ADMIN_MEDIA_PREFIX = '/media/admin/'。所以一些CSS和JS文件,比如forms.css和RelatedObjectLookup.js,它们的路径是这样的:

/media/admin/js/admin/RelatedObjectLookup.js 和 /media/admin/css/forms.css。

但是在我的项目里并没有/media/admin这个文件夹。不过,当我用manage.py脚本启动服务器并浏览页面时,上面的CSS和JS文件却能正常加载。我发现forms.css和RelatedObjectLookup.js文件其实是在Django内部的。不过,我对Django内部的路径有点困惑,它是这样的:

/usr/local/lib/python2.7/site-packages/django/contrib/admin/media/js/calendar.js

所以我很困惑,这些文件是怎么被获取的。在服务器的日志中,我可以看到其他文件的GET请求,但没有看到forms.css和RelatedObjectLookup.js的请求。

在我运行manage.py后,我的服务器请求日志里有以下内容:

[23/Aug/2011 02:20:36] "GET /media/js/DateTimeShortcuts.js HTTP/1.1" 304 0
[23/Aug/2011 02:20:36] "GET /media/js/custom/new_appointment_new.js HTTP/1.1" 304 0
[23/Aug/2011 02:20:36] "GET /media/js/fancybox/jquery.mousewheel-3.0.4.pack.js HTTP/1.1" 304 0
[23/Aug/2011 02:20:36] "GET /media/js/fancybox/jquery.fancybox-1.3.4.pack.js HTTP/1.1" 304 0
[23/Aug/2011 02:20:36] "GET /media/js/fancybox/jquery.fancybox-1.3.4.css HTTP/1.1" 304 0

正如你所看到的,日志里没有forms.css和RelatedObjectLookup.js文件的请求。

有什么建议吗?

2 个回答

1

ADMIN_MEDIA_PREFIX 是一个网址路径。如果你用 runserver 启动服务器,Django 的服务器会自动处理请求,比如 http://localhost/media/admin/whatever.js,并提供管理员的静态文件。它不会把这些文件的请求打印到控制台上。

但是,如果你不是用 runserver 启动的,那你就得确保 ADMIN_MEDIA_PREFIX 指定的路径确实能提供管理员的静态文件。举个例子,在我们的网站上,STATIC_URLhttp://static.oursite.com/,而 STATIC_ROOT/srv/django-static/oursite/。我们把 ADMIN_MEDIA_PREFIX 设置为 http://static.oursite.com/admin/。当我们运行 python manage.py collectstatic 时,它会把所有的静态文件放到 STATIC_ROOT 里。它还会在 STATIC_ROOT 中创建一个叫 admin 的文件夹,把所有管理员的文件放进去。另一个服务器负责处理 http://static.oursite.com/ 的请求,它简单地提供 STATIC_ROOT 文件夹的内容,这里面也有 admin 文件夹。这样,普通的静态文件和管理员的静态文件都能正常提供。

2

看看这个AdminMediaHandler,它是由runserver命令使用的。正如你所看到的,AdminMediaHandler并不会记录任何信息。

撰写回答