问题描述:
Django1.10版本中框架中settings.py
配置文件
配置文件settings.py
配置了下面两项:
DEBUG= False
ALLOWED_HOSTS = ['*'] #这样可以让所有来源的ip访问到后台
使用 python3 manager.py runserver
后访问,发现没有css
,js
样式。
网上查询得知:Django 关闭DEBUG模式后,就相当于是生产环境了,Django官网上指出如果是django框架一旦作为生产环境,那么它的静态文件访问接口就不应该从Django框架中走了,应该有独立的web环境,首推nginx 。
我们知道在开发过程中,开发人员都喜欢在框架的根目录下创建一个static
目录,目录在根据里面有几个APP创建对应APP程序静态文件目录。举例如图:
但是一旦放到生产环境(也就是关闭掉DEBUG模式),你在nginx中就要单独做访问/static/
目录的路由。
nginx配置如下:
server {
listen 443 ssl;
server_name app308.acapp.acwing.com.cn;
ssl_certificate cert/acapp.pem;
ssl_certificate_key cert/acapp.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
charset utf-8;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
client_max_body_size 10M;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_read_timeout 60;
}
location /static {
alias /home/acs/acapp/static/;
}
}
看到没有,这一个Django框架中的所有静态文件都应该从这个 /home/acs/acapp/static/
目录中获取。
那么我们就应该把开发人员在开发过程中所创建的所有静态目录放到一个目录下。
于是人性化的Django框架,就想到这一步。就是让你配置一个静态目录的根目录:STATIC_ROOT
,
配置如下:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
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
目录下。
-
首先从Django的扩展包中,将admin管理后台的 js 和 css等静态文件拷贝到配置文件中的
STATIC_ROOT
目录下。 -
然后将
STATICFILES_DIRS
列表中所有目录下的内容也拷贝到STATIC_ROOT
目录下。
静态目录拷贝后的结果如图:
是拷贝,不是剪切,所以生产中最好把开发测试目录过滤掉。
网上有很多关于 STATIC_ROOT
目录 和 STATICFILES_DIRS
的错误理解:有说是STATICFILES_DIRS
列表中的目录是放多个APP共用的静态目录列表。而STATIC_ROOT
是APP独享静态目录。这种事错误的说法。
正确的解释是:
STATICFILES_DIRS
列表中的目录是开发时创建的静态目录。
STATIC_ROOT
是Django框架放到生产环境中的唯一的一个静态目录
而当你设置DEBUG=False
时,就必须在Django框架前端部署nginx
或者其他web服务器来提供静态访问入口。