您的位置:首页 > 编程语言 > Go语言

django 静态文件的配置说明

2017-09-11 21:30 411 查看

STATIC主要指的是如css,js,images这样文件

首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py
# the settings above
# STATIC SETTINGS
STATIC_URL = '/static/'
# BASE_DIR 是项目的绝对地址
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
#以下不是必须的
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'common_static'),
)
123456789

1.STATIC_URL

STATIC_URL ='/static/'1. 在开发环境中,STATIC_URL指的是app的static文件夹(名字就是"static"),在每个app所在文夹均可以建立一个static文件夹 将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹。2. 该变量在部署环境中,则指的是通过浏览器以什么地址来访问static文件。后文会提到(django利用STATIC_URL来让浏览器可以直接访问静态文件,比如:
STATIC_URL = '/static/'
1那么可以在浏览器上输入: http://192.168.1.2:8000/static/common_static/myapp/photo.png 那么就相当与访问/home/mysite/common_static/myap/photo.png所以在浏览器上,利用前缀 STATIC_URL的具体内容,来映射STATIC_ROOT, HTTP://192.168.1.2:8000/static 相当于 本地地址的STATIC_ROOT)。Static file namespacingNow we might be able to get away with putting our static files directly in 
my_app/static/
 (ratherthan creating another
my_app
 subdirectory), but it would actually be a bad idea.Django will use the first static file it finds whose name matches, and if you had a static file with the same name in a different application, Django would be unable to distinguish between them. We need to be able to point Django at the right one,and the easiest way to ensure this is by namespacing them. That is, by putting those static files inside another directory named for the application itself.(xys:所以一般的app(polls)下的static目录是这样的:polls/static/polls/,然后在该目录下存放各类静态文件,或者再分别建立子文件夹/css/,/js/,/images/等)

2.STATICFILES_DIRS

而实际情况下,静态文件的一般安放位置有两种:1.一种就是在每个app里面新建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(所以,不要把文件夹的名字写错哦, 否则django就找不到你的文件夹了)2.另一种,就是在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为最后所有的静态文件都会在STATIC_ROOT里面存在) 那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,那就需要配置STATICFILES_DIRS了
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'common_static'),
)
123STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)

3.STATIC_ROOT

STATIC_ROOT 是在部署的时候才发挥作用。STATIC_ROOT 是在部署静态文件时(pyhtonmanage.pycollectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址,在这里,比如我的项目mysite是/home/mysite/ 那么STATIC_ROOT 为 /home/mysite/collect_static/ 当部署项目时,在终端输入:
python manage.py collectstatic
1django会把所有的static文件都复制到STATIC_ROOT文件夹下。例如,在app polls下存在/static/polls/xx.css,在app mapp下存在/static/mapp/yy.css,在common_static目录下存在zz.css,当运行python manage.pycollectstatic后,会在工程根目录新建一个文件夹collect_static,该目录下存在zz.css、/polls/xx.css、/mapp/yy.css几个子目录和文件。(这可以解释为什么在各个app的static目录下要多建一层以app名字命名的子目录,而不是将静态文件直接放在app的static目录下的原因)如何访问静态文件模板中访问静态文件假设静态文件目录如下:polls/static/polls,那么模板文件有两种访问方式方式一:在index.html中引入外部资源文件时,使用路径硬编码方式进行引用:(此处所谓的硬编码是指:如果STATIC_URL="/static/",则引用时写"/static/xxxx";如果STATIC_URL="/staticAAA/",则引用时写"/staticAAA/xxxx"。方式二中则不同,永远只要用{% static xxx %}即可实现引用)js文件:
<script src="/static/polls/jquery.js"></script>
css文件:
<link href="/static/polls/bootstrap.min.css" rel="stylesheet">
图片:
<img class="img-responsive" src="/static/polls/phones.png" alt="">
 注意:在用硬编码引用静态文件时,必须是"/static/xxxx"的形式,不能是"static/xxxx",就是static前面的斜杠不能省。(笔者亲自踩过的坑,      忘了static前的斜杠,则django找不到静态文件。)
#笔者踩坑笔记
#假设在django项目testprj中,新建了app polls,且设置其setting.py中的static_url='/static/'
#index.html
img = "static/polls/a.jpg"
1、假设url映射为
testprj的url.py中:
urlpatterns = [url(r'^$',include('polls.urls'))]
polls的url.py中:urlpatterns = [url(r'^$',views.index)]
而views.index函数又渲染index.html的话,
那么当在地址栏输入http://localhost时,index.html是可以正确加载图片的。
2、假设假设url映射为
testprj的url.py中:
urlpatterns = [url(r'^graph/',include('polls.urls'))]
polls的url.py中:urlpatterns = [url(r'^$',views.index)]
而views.index函数又渲染index.html的话,
那么当在地址栏输入http://localhost/graph时,index.html不能正确加载图片,系统并没有到static所在的目录下去寻找图片,
而是报错:无法找到http://localhost/graph/static/polls/a.jpg。
由此可见:此时django的静态文件查找机制不起作用,浏览器认为是直接按地址栏的相对路径进行查找,即查找路径为:
"http://localhost/graph/"     +       "static/polls/a.jpg"
方式二:用STATIC_URL来代替具体的/static/来设置资源路径:(xys推荐使用这种方法)为增强可移植性,在模板中可以用:STATIC_URL来代替具体的/static/来设置资源路径,具体在模板文件中访问的时候,都是统一用:{% static %}资源名的方式,就可以访问到资源,不论具体的目录是STATIC_URL设置的APP下的static,还是STATICFILES_DIRS设置的project下的common_static,都可以用/static/资源名的方式访问到。但是需要在settings.py中2个地方进行设置,否则会发生取不到资源的错误:1. INSTALLED_APPS 中,加入 'django.contrib.staticfiles'2. TEMPLATES 中,context_processors中,加入django.template.context_processors.static(xys:这个有疑问,不一定需要)先在index.html文件中输入:{% load static %},再按如下方式进行引用。js文件:
<script src="{% static 'polls/jquery.js' %}"></script>
css文件:
<link href="{% static 'polls/bootstrap.min.css' %}" rel="stylesheet">
图片:
<img class="img-responsive" src="{% static 'polls/phones.png' %}" alt="">
       注意:在非模板文件(如js、css文件)中要引用静态文件时,由于非模板文件无法使用{% load static %}这种模板语言,所以只能采用硬编码的方式进行引用。(https://docs.djangoproject.com/en/1.11/howto/static-files/In your templates, either hardcode the url like 
/static/my_app/example.jpg
 or, preferably,use the 
static
 templatetag to build the URL for the given relative path by using the configured 
STATICFILES_STORAGE
 storage(this makes it much easier when you want to switch to a content delivery network (CDN) for serving static files).
{% load static %}<img src="{% static "my_app/example.jpg" %}" alt="My image"/>
)浏览器中访问静态文件那么到此为止,静态文件的机制就可以运作了,但是有一个问题,我能不能通过url直接访问我在项目中的静态文件呢,答案肯定是啦,但是,注意,你是在浏览器是访问,你不可能输入你的静态文件的本地绝对地址吧,比如我的一种图片的本地地址为 /home/mysite/common_static/myapp/photo.png 那么别人不可能在浏览器上直接输入: http://192.168.1.2:8000/home/mysite/common_static/myapp/photo.png 这样子,浏览器会报错, 没有该页面 那么django是如何让浏览器也可以访问服务器上的静态文件呢,前面已经说了,直接访问服务器本地的地址是不行的,那就需要一个映射,django利用STATIC_URL来让浏览器可以直接访问静态文件,比如:
STATIC_URL = '/static/'
1那么可以在浏览器上输入: http://192.168.1.2:8000/static/common_static/myapp/photo.png 那么就相当与访问/home/mysite/common_static/myap/photo.png所以在浏览器上,利用前缀 STATIC_URL的具体内容,来映射STATIC_ROOT, HTTP://192.168.1.2:8000/static 相当于 本地地址的STATIC_ROOT#假设在django项目testprj中,新建了app polls,且设置其setting.py中的static_url='/static/'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django