这个坑摆弄了一天!
首先看我的项目目录:
1.static文件整个目录有两个,一个在项目根目录下标记为1的,另一个是在项目app下标记为2的。需要注意的是2处的文件名必须为static,django会根据static文件名去查找,之所以在static下又加入了wechat文件,是为了防止以后项目里有多个app时候static太多分不清所以设置的命名空间,为什么会分两个static呢下面解释。
2.首先如果你是DEBUG环境下,那么项目settings.py下degub设置为True,这样的话django1.8是会自己去找静态文件,不需要你改动任何操作,貌似低版本需要在urls里加入处理静态文件的server,总之我调试的1.8版本在debug模式下不需要任何操作就可以加载到静态文件。
DEBUG = True
3.那么令人头疼的问题来了,在开发服务器下,静态文件是加载不到的,一直显示是404找不到文件,我的html里加载静态文件的代码是这样的:
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="{% static 'wechat/css/style.css' %}" />
<script src="{% static 'wechat/js/home.js' %}"></script>
<title></title>
</head>
<body>
<p class="test">this is first Django Page</p>
</body>
</html>
4.首先我的app下是有静态文件的,也就是第一章图标记为2的地方,我html里引用的也是2处的静态文件,另外django自带的admin后台管理也会加载自己的静态文件,如果放在开发服务器上admin的静态文件也是找不到的,如果你不用admin后台管理,可以忽略我刚说的这些,为了开发迁移到开发服务器方便,你需要在settings里设置STATIC_ROOT让所有散乱在项目的静态文件都集中到一起直接迁移到开发服务器上,django会自动根据你html里引用的去找静态文件,也就是说你什么都不用做,django帮你完成,我是这样理解的,虽然你引用的是2处的静态文件,但是在开发服务器上会去1处找对应的文件,现在在settings里设置一下:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
5.BASE_DIR是项目根目录,我对应的是D:\\Pycharm\\wechat_huoyun,那么STATIC_ROOT对应的就是D:\\Pycharm\\wechat_huoyun\\static也就是第一张图里的1的标记地方。之后在命里行里进入到和manage.py相同目录下执行:
python manage.py collectstatic
6.之后django会自动把项目里所有静态文件,包括admin或者你有多个app下的所有静态文件都集合整理到你STATIC_ROOT设置的目录里,也就是第一章图里标记为1的地方。下次你改动js文件只要再次执行此命令,然后直接迁移STATIC_ROOT里的文件到开发服务器里就可以了。现在需要迁移到开发服务器里了首先把debug改为False,另外需要设置允许访问的host:
DEBUG = False
ALLOWED_HOSTS = ['*']
7.之后本地做的事情就OK了,现在需要配置服务器nginx了:我的文件在这里
vim /usr/local/nginx/conf/nginx.conf
配置如下:
location /static {
autoindex on;
alias /root/wechat_huoyun/static;
}
8.这里配置的location /static 是说请求为/static的静态文件都去/root、wechat_huoyun/static下去找,也就是我们项目根目录下的static去找,而不是我们每个APP下的static文件下去找,网上有很多教程,关于static的配置写法也有很多,要注意alias和root的区别,root /path相当于访问static的时候是访问/path/static,而alias /path相当于访问static时是访问/path/。所以你要是写了root /root/wechat_huoyun/static;nginx会去找
/root/wechat_huoyun/static/static里找,那估计就找不到了。
9.设置成这样的之后,静态文件都交给nginx处理,动态请求交给django去处理。然后重启nginx重启uwsgi。
10.以为很成功了,但是还是找不到,不是404了而且403.做到这一步,你应该就会明白,其实nginx和django的settings是配置正确的了,因为起码不是404找不到了,而是被拒绝403,想了想肯定是权限问题,你项目根目录里的static文件下的js和css文件都需要读权限,包括他的所有父亲目录也都需要读权限。
11.这里需要说明的是我把项目放到了root下了,这是不应该的,因为我需要修改所有父目录的权限也就是要把root目录权限有改了,不安全,由于我是个人练习的,git和自动化配置都设置后了懒得改了所以直接将root以及子孙目录一直到static的静态文件的权限都改了:
chmod -R 755 root
12.这里需要注意的是root我其实没有改这么大权限,我root是555权限,root子孙目录是755,本来我以为有读权限就可以了,但是还是403,查了查,网上说还需要x权限,所以我改成了755,所以纠正上面的所有目录需要读权限,是所有目录都需要读和执行权限。至此,大功告成,静态文件加载成功!