最近一直在用Django1.6和1.7做项目,感触比较多,如果大家初次使用Django的话难免会对它的静态文件配置感到头疼,网上也是众说纷纭,所以我把我的解决思路整理一下,希望能对大家有所帮助。
需要说明一下,在Django的项目文件里有一个DEBUG = True选项,当这个选项为True时为调试模式,在这个模式下我们可以通过
root@ubuntu:~/mysite# python manage.py runserver
来运行Django自带服务器,而当DEBUG=False时,调试模式关闭,这是一般使用Nginx之类的服务器来运行。在这个时候静态文件的加载是交给Nginx来设置的。所以我们进行静态文件配置主要是为了在runserver模式下进行测试开发。我实验了两种方法。
(一)、利用templates来加载。
我们在使用Django时,一定会在setting.py文件中配置一个TEMPLATE_DIRS的路径,一般是在工程目录下建立一个叫templates的文件夹,来存储我们的模板,第一种方法正是利用这个路径来加载静态文件的url。
1、在setting.py文件中设置TEMPLATE_DIRS,例如
TEMPLATE_DIRS = (
'/home/hp/mysite/templates',
)
2、在url.py文件中
导入from mysite.settings import TEMPLATE_DIRS
并在urlpatterns = patterns中添加如下url,以我为例:
url(r'^images/(?P<path>.*)$','django.views.static.serve', {'document_root':TEMPLATE_DIRS[0]+'/css/images'}),
url(r'^css/(?P<path>.*)$','django.views.static.serve', {'document_root':TEMPLATE_DIRS[0]+'/css'}),
url(r'^js/(?P<path>.*)$','django.views.static.serve', {'document_root':TEMPLATE_DIRS[0]+'/js'}),
以上设置的路径在系统中表示为images:
/mysite/templates/css/images,
css:
/mysite/templates/css,
js:
/mysite/templates/js
即在templates文件夹下建立css和js两个文件夹,在css下建立一个叫images的文件夹。
3、在html文件中,用如下方法调用:
<link rel="stylesheet" type="text/css" href="/css/loggedin.css">
<script type="text/javascript" src="/js/regulate.js"></script>
注意一定是/css/,前面的/千万不能省略,images与这调用类似,而在css文件中,因为css与image的文件夹同目录,所以直接写images/*.png之类的即可,这里不要有前斜杠。
这个方法是可以成功的,但我感觉静态文件的布置过于散乱,而且设置了三个目录,以后在nginx里配置的时候也会稍微费些笔墨,所以我有咨询了下学长,找到了第二种方法。
(二)、用STATIC_ROOT设置
1、打开setting.py文件,在开头出一般自动建立时就会有:
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
有了它,我们就可以在setting.py里添加如下配置:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static").replace('\\', '/')
STATICFILES_DIRS = (
("css",os.path.join(STATIC_ROOT,'css')),
("js",os.path.join(STATIC_ROOT,'js')),
("images",os.path.join(STATIC_ROOT,'images')),
)
2、在html中用如下方法引用
在<head>前(随便,只要在引用静态文件前加即可)加上:
{% load staticfiles %}
之后引用文件的格式如下:
<link rel="stylesheet" type="text/css" href="{% static 'css/register.css' %}">
注意:这里css前不要用斜杠,很多时候这里出错了。js和images的引用类似。
这样在runserver中静态文件就可以使用了。
另外,还有一点需要注意,很多时候修改了css网站并没有相应的效果,这主要是由于浏览器缓存造成的,只要清理一下缓存即可。