原创博文地址:django进阶03静态文件和模板

静态文件和模板

静态文件:css,js,image,如果作为纯粹的web应用来看,静态文件的响应并不属于web应用范畴,因为静态文件不涉及业务逻辑,也不需开发业务代码。但几乎100%的web应用都支持对静态文件的直接访问。为何?主要是web应用基本上必然依赖css,js,img等静态资源,我们不可能固执的开发一个纯粹的web应用,只支持从url里进入视图函数,也只能从视图函数返回内容(简单来说所有请求路径都必须体现在url_route和view视图中)。而要求用户独立开启静态资源的请求处理服务。所以,先把静态资源服务和包含业务逻辑的web应用独立认识,二者并不相同,但强相关。其本身是独立于应用的
模板:在代码中response渲染中使用的,可以看做view视图的组成部分.所以没有独立url配置,依赖view视图存在,属于应用一部分,包含了业务逻辑(需要渲染),这一点也可以从配置上看出来。

django配置静态文件

STATIC_ROOT
所有的静态文静聚合的目录,
STATIC_ROOT要写成绝对地址,在这里,比如我的项目mysite是/home/mysite/ 那么STATIC_ROOT 为 /home/mysite/collect_static/

1
python manage.py collectstatic # 把所有的static文件都复制到STATIC_ROOT文件夹下

可见,STATIC_ROOT 是在部署的时候才发挥作用。简单来说,开发时可能按应用分散开发,所以css,js等都是按应用分散到各自应用目录下,但是在部署时,不大可能在前置的web服务器中配置多个分散的应用目录(而且也会带来高耦合问题)。所以需要“整合”到一个目录,然后nginx的服务器指向此目录即可。

STATICFILES_DIRS
开发时静态资源路径,前面说过部署时会使用STATIC_ROOT作为静态资源路径。但开发时一般不会有独立的静态资源服务器,所以允许分散性配置,同时,这个也是生成STATIC_ROOT里文件的“源路径”。
STATICFILES_DIRS里文件夹又份两种,
app应用独立占用:一种就是在每个app里面新建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(所以,不要把文件夹的名字写错哦, 否则django就找不到你的文件夹了)
项目(多个或所有应用)共享:就是在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为最后所有的静态文件都会在STATIC_ROOT里面存在) 那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,那就需要配置STATICFILES_DIRS了

1
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'common_static'), )

STATICFILES_DIRS告诉django,首先到STATICFILES_DIRS里面寻找静态文件,其次再到各个app的static文件夹里面找(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)

STATIC_URL
那么到此为止,静态文件的机制就可以运作了,但是有一个问题,我能不能通过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来让浏览器可以直接访问静态文件,比如:

1
STATIC_URL = '/static/'

那么可以在浏览器上输入: http://192.168.1.2:8000/static/common_static/myapp/photo.png 那么就相当与访问/home/mysite/common_static/myap/photo.png

开发环境下静态文件都是通过Django自带的web服务器来处理的(这样会更方面)。如果把DEBUG设置成False,那么Django自带的web服务器自然不处理静态文件了,静态文件都交给nginx,apache来处理吧(这样会更高效)。
另外,Django提供了一个findstatic命令来查找指定的静态文件所在的目录,例如:

1
D:\TestDjango>python manage.py findstatic Chrome.jpg ('D:/TestDjango/TestDjango/templates',)

django配置模板

模板相关配置

1
2
3
4
5
6
7
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')], # 公共共享文件夹'APP_DIRS': True,# 检索app里面的templates文件夹}
]

模板相关配置只有2项,实际这2项目,如果和静态文件比对起来,只对应了1项,就是STATICFILES_DIRS
所以:TEMPLATES(原始)并不支持从url直接respones,而是需要经过url_route,view处理,view_response(html),
所以模板不需要独立路由配置,其路由有具体调用其的view决定,也就没有STATIC_URL类似的配置。当然也不存在静态资源统一保存的需求,也就不需要STATIC_ROOT类似的配置。

Django 模板查找机制
Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找)。
各个 app 的 templates 形成一个文件夹列表,Django 遍历这个列表,一个个文件夹进行查找,当在某一个文件夹找到的时候就停止,所有的都遍历完了还找不到指定的模板的时候就是 Template Not Found (过程类似于Python找包)。这样设计有利当然也有弊,有利是的地方是一个app可以用另一个app的模板文件,弊是有可能会找错了。所以我们使用的时候在 templates 中建立一个 app 同名的文件夹,这样就好了。
这就需要把每个app中的 templates 文件夹中再建一个 app 的名称,仅和该app相关的模板放在 app/templates/app/ 目录下面

不使用view直接跳转

1
urlpatterns = [ path('about/', TemplateView.as_view(template_name="about.html")), ]

参考

Django 模板:https://code.ziqiangxuetang.com/django/django-template.html
django—不使用view,直接从Url转到html:https://blog.csdn.net/weixin_30325487/article/details/97544472
Django关于访问静态文件总结:https://blog.csdn.net/WaitForFree/article/details/39815507
django 静态文件之配置说明(Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS区别关系):https://blog.csdn.net/alxandral_brother/article/details/52202270

django进阶03静态文件和模板相关推荐

  1. 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍(学习笔记)

    目录 1. 安装Django 2. 创建项目(startproject) 2.1 创建项目 2.2 介绍项目文件 2.3 APP(startapp) 3. 走通流程(urls, views, runs ...

  2. Flask框架(一)--搭建,请求,静态文件,模板(日历制作)

    Flask 轻量级框架:flask,web.py,tornado,开发灵活,开发效率低,可以真正体现程序员的水平. 重量级框架:django,方便程序员开发,提供大量的功能组件(站点管理,csrf_t ...

  3. Django高级管理静态文件和中间件5.1

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [os ...

  4. 加载静态文件,父模板的继承和扩展

    一.用url_for加载静态文件 <script src="{{ url_for('static',filename='js/login.js') }}"></s ...

  5. 加载静态文件,父模板的继承和扩展(2017.11.3)

    用url_for加载静态文件 <script src="{{ url_for('static',filename='js/login.js') }}"></scr ...

  6. 作业21-加载静态文件,父模板的继承和扩展

    用url_for加载静态文件 <script src="{{ url_for('static',filename='js/login.js') }}"></scr ...

  7. Django加载静态文件

    方法一: 1.在app目录中创建static 目录,并在该目录下创建存储css,img,js的子目录. 2.在相应的目录下创建相对应的静态文件. static/css/mystyle.css, sta ...

  8. 慕课网Flask高级编程实战-7.静态文件、模板、消息闪现与Jinja2

    7.1 静态文件访问原理 1.默认访问方法 Flask访问静态文件非常简单,只需要在项目根目录建立static文件夹.将静态资源文件放入static下即可.访问的时候访问http://ip:port/ ...

  9. Django+Nginx部署静态文件

    通过Nginx部署Django项目时,需要通过Nginx来部署静态文件.具体操作如下: 设置static根目录 在项目的setting.py中"STATIC_URL = '/static/' ...

最新文章

  1. 十、springboot注解式AOP(@Aspect)统一日志管理
  2. [YTU]_1055 (输入字符串以及输出)
  3. 云时代架构阅读笔记十三——你的系统如何处理高并发?
  4. python爬虫之图片
  5. 算法-动态规划(01背包)
  6. 灰色系统与灰色预测模型
  7. mysql使用条件限制乐观锁_使用Mysql乐观锁解决并发问题
  8. MarkerOpter marker操作类
  9. mongodb objetcid_mongodb(1)
  10. C++之log4cpp库
  11. 工商阿里忙互殴 苏宁高调打假争做主角?
  12. win7蓝牙怎么连接_小米智能手环怎么连接手机蓝牙
  13. 职业高中计算机英语必背单词,高中英语3500个必背单词.pdf
  14. Ir_scheduler模块
  15. 让荣之学告诉你Shopee选品思路及运营方法!
  16. WordPress主题-一个极简的免费WordPress博客主题
  17. 【笔记总结】计算机系期末复习、专业课学习、算法与其他笔记
  18. HDU 1495 非常可乐(BFS||数论)
  19. windows系统各个端口作用
  20. 基于STC89C51单片机的数字电压表设计

热门文章

  1. 区块链优秀github开源项目
  2. go使用makefile
  3. sql server序列_SQL Server中的Microsoft时间序列
  4. sql安装弹出sqlcmd_讨论使用SQLCMD和SQL Server代理进行备份和还原自动化
  5. sql 时态表的意义_SQL Server中的时态表
  6. 老蒋征婚启示啊啊啊啊啊啊
  7. Bzoj 4371: [IOI2015]sorting排序 二分
  8. Java-杂项:Java数组Array和集合List、Set、Map
  9. android setCompoundDrawables和setCompoundDrawablesWithIntrinsicBounds区别
  10. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。...