好久没有接触Django开发了,虽然之前用过很久,但是因为Python的工作机会不是很多, 于是找工作期间主要复习Java,Django和Python都放下太久了.有意思的是, 尽管我找工作期间一直在复习Java,可是最后签约的好未来却恰恰需要的是我的Python+Django技能. 这不,又开始重新拾起Django,第一天就遇到一个问题.

为了加载静态文件,Django的默认settings.py里已经预设了如下配置:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'

然后我的项目根目录的templates里面,有如下的html语句(base.html):

{% load staticfiles %}
<!-- 其他html语句 -->
<script type="text/javascript" src= "{% static "jquery-1.11.3.js" %}"></script>

jquery-1.11.3.js这个文件是在static目录中, 但是直接在浏览器访问http://127.0.0.1:8000/static/jquery-1.11.3.js, 却总是404,最后查看官方文档,才意识到原来是自己没有设置STATICFILES_DIRS, 倒置Django不知道哪里去找静态文件,所以404,于是在settings.py里加了如下语句就可以正常工作了:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

那么,问题是,为啥官方文档没有直接把STATICFILES_DIRS设置好呢?仔细看了下官方文档, 发现其实这个static目录并不是为整个项目服务的,即根目录的templates是无法自动识别 static目录的,这个目录其实是为单独的app服务的,即该目录是应该放在app目录下, 与migrations和目录级别的templates服务的,在这种情况下,就不需要STATICFILES_DIRS这个设置了. 那么,STATICFILES_DIRS是为什么设置的呢?官网如是说:

Your project will probably also have static assets that aren’t tied to a particular app.

即不是服务与单独的app的,而是类似jquery这种是服务于整个项目的静态文件,才需要用到.

那么,如果我设置了STATICFILES_DIRS为某目录,比如static01,其中有img.jpg, 又在app的static目录下也有img.jpg,那么,会加载哪个文件呢?

根据STATICFILES_FINDERS的默认设置,是会优先从STATICFILES_DIRS中寻找的.



blog comments powered by Disqus

Published

17 November 2015

Category

tech_world

Tags