本地开发Django静态文件 - 如何绝对服务?
这件事应该很简单,但我今天早上一直卡在这里。我在本地开发,使用的是django调试服务器,文件结构如下:
/project/ (django project)
/static/ (static files)
在settings.py文件中,MEDIA_ROOT和MEDIA_URL都设置为'/static/',我在urls.py中也使用了这个设置。
url(r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root': '../static'}),
在我的模板中,需要从静态目录提供的文件配置如下:
<link rel="stylesheet" href="{{ STATIC_URL }}css/style.css">
这一切都正常工作——主页上的JavaScript、CSS和图片都能正确加载。但是,当我访问一个子目录,比如http://127.0.0.1:8000/news/时,所有的链接都坏掉了。
我尝试了各种os.import选项,希望能让它正确处理相对链接,但都没有成功。有没有办法强制它相对于基础网址,或者直接写死在我的文件系统中呢?
任何帮助都太棒了!
3 个回答
当你进入一个子目录时,你的链接是怎么坏掉的?能不能再详细解释一下?
django 1.3支持某种奇怪的相对网址路由来处理静态媒体吗?
如果它可以从主页提供,但在其他地方不行,这是不是听起来像你的 STATIC_URL
是一个相对位置?
你的 STATIC_URL
是什么?它应该是绝对路径,并且以斜杠开头。
我刚遇到同样的问题,解决方法是把STATIC_URL='/static/'里的第一个斜杠去掉,改成STATIC_URL = 'static/',就像philipbe上面写的那样。奇怪的是,'/media/'在MEDIA_URL里用得很好(而'media/'会导致布局出问题)。
总之,只需要把STATIC_URL改成'static/',不要前面加斜杠,这样就能解决问题了。
在你的urls.py文件中的这一行,'../static'
应该改成一个绝对路径。试着改一下,看看会发生什么。
你的文件内容是:
url(r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root': '../static'}),
应该改成像这样:
url(r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/full/path/to/static'}),
给你举个例子,我的设置稍微有点不同,但我还是用的是完整路径。
这是我的设置方式:
在settings.py
中:
STATIC_DOC_ROOT = '/Users/kylewpppd/Projects/Django/kl2011/assets/'
然后在urls.py
中:
(r'^assets/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes':True}),
我是在'localhost:8000/assets/'
上提供我的静态文件。