django 媒体路径问题
我在使用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 个回答
ADMIN_MEDIA_PREFIX
是一个网址路径。如果你用 runserver
启动服务器,Django 的服务器会自动处理请求,比如 http://localhost/media/admin/whatever.js
,并提供管理员的静态文件。它不会把这些文件的请求打印到控制台上。
但是,如果你不是用 runserver
启动的,那你就得确保 ADMIN_MEDIA_PREFIX
指定的路径确实能提供管理员的静态文件。举个例子,在我们的网站上,STATIC_URL
是 http://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
文件夹。这样,普通的静态文件和管理员的静态文件都能正常提供。
看看这个AdminMediaHandler,它是由runserver命令使用的。正如你所看到的,AdminMediaHandler并不会记录任何信息。