下载了个网页模板,建好Django工程,runserver后页面不显示css,jpg之类的静态文件。找了一下网上的解决方案,照着做也没对,主要是他们没说为什么要这么做,每个人搭建的环境不一样,解决的方法肯定也不完全一样。这里把解决的思路写下来,供大家参考。
1. 静态文件丢失是因为文件路径找不到。server端会有如下提示
[21/Sep/2014 11:28:01] "GET /static/img/f.png HTTP/1.1" 404 1941 [21/Sep/2014 11:28:01] "GET /template/static/css/style.css HTTP/1.1" 404 1980 [21/Sep/2014 11:28:01] "GET /static/img/r.png HTTP/1.1" 404 1941 [21/Sep/2014 11:28:01] "GET /static/img/t1.png HTTP/1.1" 404 1944
2. 需要修改settings.py文件中的STATIC_ROOT, STATIC_URL, STATICFILES_DIRS三个配置项,但具体怎么修改就与各人搭建的环境有关了。
STATIC_URL配置的是匹配的静态文件请求的url,这与页面中的链接地址要一致。如html文件中的静态文件链接为/static/,则配置项为
* foo.html * <link rel="stylesheet" type="text/css" href="/static/css/style.css"> * settings.py * STATIC_URL = '/static/'
STATIC_URL的作用等同于在urls.py文件中匹配url地址请求
3. 当匹配到静态文件请求时,则会在STATICFILES_DIRS中查找静态文件,静态文件一般都是集中存放,在同一父目录下,因此可以设置STATIC_ROOT来减少重复输入。由于配置项不支持相对路径,只能使用绝对路径,考虑到移植的灵活性,STATIC_ROOT可写为
STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'template/static')
这里的__file__是settings.py文件,即以settings.py文件所在的目录出发,找到静态文件所处的目录。
4. 最后是静态文件所处的位置
STATICFILES_DIRS = ( ('css', os.path.join(STATIC_ROOT, 'css')), ('img', os.path.join(STATIC_ROOT, 'img')), )
每类静态文件设置为一个元组,元组第一项‘css’,‘img’等要与html中链接地址保持一致,不能出现配置的('img', ...),但请求的链接地址为:.../static/images/abc.jpg,而元组第二项的‘css’和‘jpg‘要与文件夹名一致。