(转自:http://www.huangwenchao.com.cn/2014/03/django-static.html)
之前在版本不对的教程里面没有提及有关 static 处理的问题,但是做项目的时候已经遇到问题了;
在整个站点的 settings.py 下面有个 STATIC_URL = ‘/static/’ 的选项,但是路由也没有额外的配置;
于是当时搞不定上百度各种找,最后发现最简便的方法就是在 settings.py 里面加上:
STATICFILES_DIRS = (os.path.abspath('static'),)
那么,其中 STATIC_URL 指定的实际上是静态文件的路由,而 STATICFILES_DIRS 指定的是静态文件在服务器目录上的路径; 这样之后,直接通过 /static/… 的地址访问就可以访问到具体的静态文件;
MORE
但是今天重看 1.6 的文档,再来学习一下官方的解决方案,在这里做一下记录。
1. All is simple
原来一切这么容易,只需要在 app 下面建立 static 目录,然后通过 /static/… 即可直接找到静态文件,无需任何配置!
内部的原理:
django 会通过 STATICFILES_FINDERS 这个配置来查找所有 installed_apps 里面的 app 下面的 static 子目录,来尝试找到目标路由指定的文件,并返回所匹配到的第一个;
2. 对静态文件划分命名空间
划分一个命名空间对于避免不同的 app 之间发生命名冲突是一个官方的解决方案;
所以建议:
在每个 app 下面创建 static 文件夹,然后在里面创建一个与 app 同名的文件夹,静态文件放在里面;
然后具体引用的时候,在路径上加好前缀就行,这样可以避免命名冲突;
3. 在模板中引用
首先,我们不应当硬编码任何 url,这是共识;
使用任何静态资源的引用 url 之前,应当先对静态文件做一个全局声明: {% load staticfiles %}
然后,具体引用静态资源时: {% static ‘[PATH]’ %} 即可渲染一个 对应静态文件的 url
4. 相对路径和绝对路径
从第 2 点可以看出,每个 app 的静态文件已经成为了一个闭包; 但是在静态文件中,是无法使用 {% static %} 这样的办法来动态生成一个 url 的。
另一点,在静态文件中不应该引用动态路由的文件(这个划分应该很好理解,减少耦合);
于是,在动态的路由视图模板中,应当总是使用 {% static %} 标签来引入静态文件,这相当于是一个绝对路径,而在静态文件中,则只应该使用相对路径来访问其他静态文件(例如在 css 里面访问图片);