做网站,不会前端总是不行的,就算自己不深入学习成为前端大拿,套用别人的css和js总还是要会的,因此,静态文件的引用成为了一个topic。
Django创建一个新项目的时候已经默认产生了一些配置,应对小项目足够了,如果追求完美的话,总还需要多了解一些。列出了以下topic。
1、 一个不做任何额外配置的django项目能怎么处理static?
2、 好好规划的static文件目录又是什么样子的?
3、 部署到生产该怎么办?
4、 Django中谁在管理着这些static文件?纯代码层面了哟
答:
1、 没有额外自己添加配置时,和static文件有关的settings,如下(从settings.py中摘出来的)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'systemadmin.apps.SystemadminConfig', ] # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/'
BASE_DIR -->项目的根目录,注释里都写了,如果想要得到项目中的文件路径,用os.path.join(BASE_DIR,….)
INSTALLED_APPS --> 管理staticfiles的Django自带APP,就是这个django.contrib.staticfiles
STATIC_URL --> 文件夹取名要叫static,和BASE_DIR配合,用来找到文件的
有了这些配置,如果我们要有css js image文件需要被html引用,那么需要遵从以下做法:
1) 在创建的app目录下新建static文件夹,下面再创建app同名文件夹,这两个文件夹是必须的,再下层的目录随你喜欢,比如再建css js image文件夹,里面分别放你要用的css js和image文件。
2) 在创建的app目录下新建templates文件夹,下面再创建app同名文件夹,这两个文件夹是必须的,下面放要用的html文件。
3) 让html文件找到这些css js image文件需要:
a) Html的head标签中
{% load static %}
b) Head中Css的href用static拼路径
{% static ‘APP名字/path/css文件’ %}
c) Body末尾Js的src也用static拼路径
{% static ‘APP名字/path/js文件’ %}
d) 静态文件的相互引用,比如css里面加了一个背景图片,load static不起作用了哟,要用相对路径去取
url(“相对路径”)
2、 1的基本配置在什么情况下不够用呢?不够用,就得自己加配置哦。
代码重用,在任何语言编程中都是需要的,在模板的编写中也一样,Django支持模板的继承和包含,因此,基本frame的html(页面布局),常组件的html(输入框、下拉框、多选框啦什么的)会想当然得放一起,大家都用css js放一起,而单独APP用到的html css js image放在APP的templates和static里面。于是形成了一个庞大的目录结构。
基于以上目录的安排,仅有基本配置可找不到相应的文件哦,需要修改。
1) 项目的settings.py中,增加STATICFILES_DIRS的[],表示除了app的static文件夹,还要找list中列出的这些地方。我们把根目录下的static文件夹加进去,公用的这些css js和image就能找到了
2) Html中还是需要load static,再用{% static ‘相对路径’%}去拼路径,获取文件
3) APP中是继承和包含基础的html,那么用{%extend ’相对路径‘%}和{% include ‘相对路径’ %}就行了
3、 部署在生产环境中,通常会将所有的static文件都放在一个地方,以方便管理。而开发模式下,我们已经从2看到了庞大的目录结构,手动去提取不现实,django提供了管理工具,步骤(生产环境上):
1) 在settings.py中添加配置
STATIC_ROOT='/djangolearn/allstatic/'
2) 控制台中敲入
Python manage.py collectstatic
运行完成后,console给出提示
204 static files copied to 'C:\djangolearn\allstatic'.
注意了哦,这里是将所有的static文件全部copy到了上述路径,而不是项目路径下面,我的环境是windows的。
3) 把这个所有文件的集合放到一台web server上提供服务。这里要分情况讨论。
a) 和django程序在一台server上
b) 专用一台server放static
c) 放在云上
具体的部署还需要看how-to guides -->Deploying Django
4、 代码层,必须得承认,我还没有这个心性去看源代码。目前就知道:
1) “django.contrib.staticfiles” Django的这个自带APP承包了对static文件的管理工作
2) Setting.py文件中STATIC_URL指定了所有的app下建立static文件夹的名字,staticfiles这个app会自动去找叫static的文件夹
3) Static文件夹下需再建立一层以APP名字命名的文件夹,以区分彼此
4) 公用的static可以放在一个目录下,但需要手动在settings.py文件中添加STATICFILES_DIRS参数的配置。