python---django中STATIC_ROOT和STATIC_URL以及STATICFILES_DIRS
先引入两篇相关文章,从中了解更为详细
Django的STATIC_ROOT和STATIC_URL以及STATICFILES_DIRS(先看)
1.STATIC_URL
#这个必须配置
STATIC_URL = '/statics/'
#这个可以不用配置
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'statics'),#BASE_DIR是项目根目录(绝对路径)
)
其中STATIC_URL是用资源路径前缀,用于访问资源时使用STATIC_URL即可,
STATIC_URL是对于每个项目APP的静态资源存放路径
#各个项目路径
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', 'ts' )
blog项目:
blog
statics(当前app静态资源路径)
jquery.js
...
其中statics目录就是STATIC_URL,每个项目APP的静态资源存放路径都应该为STATIC_URL
并且STATIC_URL必须存在,才能在模板文件中使用
<script src="statics/jquery.js"></script><!--statics是STATIC_URL前缀,与其保持一致-->
若是不存在STATIC_URL,会报错:
#django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without having set the required STATIC_URL setting.
2.STATICFILES_DIRS
STATICFILES_DIRS不是必须存在
其中STATIC_URL代表各个APP中的静态资源存放路径,放在各个APP目录下
而STATICFILES_DIRS则是放在项目根目录下
STATICFILES_DIRS = ( os.path.join(BASE_DIR,'statics'), )
项目文件分布:
HelloWorld 项目
HelloWorld(全局文件存放,项目启动产生)
settings
urls
wsgi
blog (APP)
statics (静态资源文件)
...
ts (APP)
statics
...
statics (项目根目录下静态资源文件)
common_static(STATIC_ROOT使用)
...
一般:当STATICFILES_DIRS存在时,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的statics文件夹里面找
不存在STATICFILES_DIRS时,会直接根据STATIC_URL去APP目录下查找,但是记住,STATIC_URL是必须要添加的
3.STATIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'common_static')#名字自己随意,必须创建这个文件夹
在生产环境中,集中存放静态资源有利于管理使用静态资源
配置完STATIC_ROOT以后,需要执行
python manage.py collectstatic
命令,配合STATIC_ROOT,会自动将各个app(包括STATICFILES_DIRS中的)下的静态文件集中到STATIC_ROOT目录下。
Type 'yes' to continue, or 'no' to cancel: yes
记得不是y,是yes
其中会发现,对于python manage.py collectstatic这个命令,发现可以将STATICFILES_DIRS的资源添加(而且默认会将admin中的静态文件也加入),但是当STATIC_URL中指定文件夹为statics(或者其他)时,不会添加到STATIC_ROOT指定文件夹中,但是在APP目录下单纯添加static文件夹,而不修改STATIC_URL路径,依然是
STATIC_URL = '/statics/'
当执行python manage.py collectstatic
命令是,会将static文件夹中静态文件加入到STATIC_ROOT中
blog statics (不会添加氮STATIC_ROOT中,但是STATIC_URL指向他) static (会添加到STATIC_ROOT中但是STATIC_URL没有指向) ...
所以为了避免不必要的坑,最好选择直接使用
STATIC_URL = '/static/'