问题描述:
Django1.10版本中框架中settings.py配置文件
配置文件settings.py配置了下面两项:
DEBUG= False ALLOWED_HOSTS = ['*'] #这样可以让所有来源的ip访问到后台
使用 python3 manager.py runserver后访问,发现没有css,js样式。
网上查询得知:Django 关闭DEBUG模式后,就相当于是生产环境了,Django官网上指出如果是django框架一旦作为生产环境,那么它的静态文件访问接口就不应该从Django框架中走了,应该有独立的web环境,首推nginx 。
我们知道在开发过程中,开发人员都喜欢在框架的根目录下创建一个statics目录,目录在根据里面有几个APP创建对应APP程序静态文件目录。
举例如图:
但是一旦放到生产环境(也就是关闭掉DEBUG模式),你在nginx中就要单独做访问/static/目录的路由。nginx配置如下:
server { listen 80; server_name 127.0.0.1 charset UTF-8; access_log /var/log/nginx/django_pro01_access.log; error_log /var/log/nginx/django_pro01_error.log; client_max_body_size 75M; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; } location /static { #这里做了访问静态目录不走uwsgi expires 30d; autoindex on; add_header Cache-Control private; alias /usr/share/nginx/TengLan/TengLan/staticfiles; # #alias /usr/share/nginx/django_pro01/static/; } }
看到没有,这一个Django框架中的所有静态文件都应该从这个 “/usr/share/nginx/TengLan/dTengLan/staticfiles” 目录中获取。
那么我们就应该把开发人员在开发过程中所创建的所有静态目录放到一个目录下。
于是人性化的Django框架,就想到这一步。就是让你配置一个静态目录的根目录:STATIC_ROOT,
配置如下:
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') STATIC_URL = '/static/' # Extra places for collectstatic to find static files. STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
然后配置好后,再执行
python3 manage.py collectstatic
这个命令的执行目的,就是将在开发模式中定义的静态目录,统一拿到STATIC_ROOT目录下。
1.首先从Django的扩展包中,将admin管理后台的jss 和css等静态文件拷贝到配置文件中的STATIC_ROOT目录下。
2.然后将STATICFILES_DIRS 列表中所有目录下的内容也拷贝到STATIC_ROOT目录下
静态目录拷贝后的结果如图:
对是拷贝,不是剪切,所以生产中最好把开发测试目录过滤掉在放到生产环境。
网上有很多关于 STATIC_ROOT目录 和 STATICFILES_DIRS的错误理解:有说是STATICFILES_DIRS列表中的目录是放多个APP共用的静态目录列表。而STATIC_ROOT是APP独享静态目录。这种事错误的说法。
正确的解释是:
STATICFILES_DIRS 列表中的目录是开发时创建的静态目录。
STATIC_ROOT 是Django框架放到生产环境中的唯一的一个静态目录
而当你设置DEBUG=False时,就必须在Django框架前端部署nginx或者其他web服务器来提供静态访问入口
看看官网的说明如下链接https://devcenter.heroku.com/articles/django-assets