事关Django的静态资源目录设置与静态资源文件引用(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)

在Django的setting.py中常见的三句静态资源(static)目录设置语句如下:

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_list')]  # 注意这是一个列表,即可以有多个目录的路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
STATIC_URL = '/static-url/'

本文介绍这三句话的作用。

要明白这三句话的作用,首先您要知道Django的HTML模板文件在引入静态文件,比如CSS、JS文件时,经过我实测 ,是不能直接写上绝对路径或相对路径来引用的。

比如下面这样直接写上绝对路径是不行的:

<link rel="stylesheet" href="E:/dj_project/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css">

下面这样直接写上相对路径也是不行的:

<link rel="stylesheet" href="../static/bootstrap-4.5.3-dist/css/bootstrap.css">

当然下面这样写上相对路径也是不行的:

<link rel="stylesheet" href="/static/bootstrap-4.5.3-dist/css/bootstrap.css">

经实验证明,只有使用Django的相关模板标签才能在HTML模板文件中引用静态文件。
一个具体的例子如下:

{% load static %}
<!DOCTYPE html>
<html>
<head>.......<link rel="stylesheet" href="{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}">
</head>
......
</html>

即在模板文件的顶端使用语句{% load static %}进行静态文件的加载,具体的加载点就在各个模板标签语句中,比如上面代码中的:{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}

静态文件的加载过程是下面这样的:
Step1 :
Django会对HTML模板中类似下面这样的模板标签进行解析,解析的结果是得到静态文件可能存在的部分路径:

"{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}

Step2:
按setting.py中的相关语句的设置并与Step1得到的部分路径组合得到完整路径,并按一定的顺序去遍历这些路径,从而找到需要的静态文件并进行加载。

接下来,以一个实际例子说明整个过程具体是怎么样的,把整个过程搞清楚了,本文开头提到的三条与静态资源目录设置的语句也就搞清楚作用了。

现在作如下这些假设:
①Django项目的根目录路径为:F:/dj_pro/,即BASE_DIR = 'F:/dj_pro/'
②应用的名字为app1
③模板HTML中有如下代码:

{% load static %}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>静态资源文件说明</title><link rel="stylesheet" href="{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}">
</head>
<body>
</body>
</html>

④setting.py中与静态资源目录设置的相关三条语句如下:

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_list')]  # 注意这是一个列表,即可以有多个目录的路径
STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
STATIC_URL = '/static-url/'

现在当视图函数调用模板HTML文件后,遇到模板HTML的第1条语句:

{% load static %}

然后就去寻找模板HTML文件中与的相关模板标签,并找到了下面这一句:

{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}

这一句分为两部分,第一部分是模板变量static,第二部分是路径常量bootstrap-4.5.3-dist/css/bootstrap.css

先说变量static的作用:
变量static的定义语句如下:

STATIC_URL = '/static-url/'

所以模板变量static的具体值为:/static-url/,这个具体值与后面的路径常量bootstrap-4.5.3-dist/css/bootstrap.css组成了一个URL,这个URL为:/static-url/bootstrap-4.5.3-dist/css/bootstrap.css,那么这个URL有什么作用呢?
它的作用就是提供最终显示在浏览器的HTML页面的源代码中的相关字符串。比如网页在浏览器端成功打开后,我们用CTRL+U查看网页源代码,发现相关字符串的内容如下:
在这里插入图片描述
这就是这个URL的作用,当然也只是昊虹君的理解,如果昊虹君理解错误或者还有别的作用,麻烦这篇文章下评论告知一声,谢谢。
当然就这里来说,这个变量static是没有作用的,但是如果是图片文件这些静态资源呢,那可能就用了,因为图片这类资源我们可以直接放在Nginx建立的网站的根目录下,并且通过配置Nginx配置这些图片的URL路径不进行反向代理。

接下来说第二部路径常量bootstrap-4.5.3-dist/css/bootstrap.css的作用

常量bootstrap-4.5.3-dist/css/bootstrap.css的作用要分两种情况来说明:
注意:不管是下面的哪两种情况,都与{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}中的模板变量static无关。
注意:不管是下面的哪两种情况,都与{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}中的模板变量static无关。
注意:不管是下面的哪两种情况,都与{% static 'bootstrap-4.5.3-dist/css/bootstrap.css' %}中的模板变量static无关。

第01种-没有执行命令python manage.py collectstatic的情况

在这种情况下,Django在加载HTML模板文件时对于静态文件bootstrap.css的查找是按下面的顺序来进行的:

  1. 各个应用的static目录
    Django 会首先查找每个应用中的 static 目录,这是默认的静态文件存放位置。每个应用通常都有一个 static 目录,用于存放该应用的静态文件。如果你在应用中创建了这样的目录,Django 将会在其中查找相应的静态文件。
    具体来说,由于我的应用名字为app1,所以会去查找由BASE_DIR/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css组成的路径。即路径:BASE_DIR/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css,也就是路径:F:/dj_pro/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css 中是否存在文件bootstrap.css。
    如果找到了文件bootstrap.css,则停止查找,如果没有找到,继续往下找。

  2. STATICFILES_DIRS中的静态文件
    如果在各个应用的 static 目录中找不到所需的静态文件,Django 将在 STATICFILES_DIRS 指定的目录列表中进行查找。
    具体来说,这里:

    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_list')]  # 注意这是一个列表,即可以有多个目录的路径
    

    所以会到由 BASE_DIR/static_list/ 和 bootstrap-4.5.3-dist/css/bootstrap.css 组成的路径,即路径:
    BASE_DIR/static_list/bootstrap-4.5.3-dist/css/bootstrap.css,也就是路径:F:/dj_pro/static_list/bootstrap-4.5.3-dist/css/bootstrap.css 中去查找文件bootstrap.css。
    如果找到了文件bootstrap.css,则停止查找静态文件bootstrap.css。如果此时仍没有找到,则停止查找。

在第01种情况下,没有集中存放静态文件,而是直接在各个应用的 static 目录中和STATICFILES_DIRS指定的目录列表中查找。这在开发阶段是方便的,但在生产环境中通常会通过执行 python manage.py collectstatic 来将静态文件集中存放到一个目录,以提高性能和更好地组织静态文件,于是便产生了第2种情况。

第02种-执行命令python manage.py collectstatic的情况
当运行 python manage.py collectstatic 命令时,Django 会从各个应用的 static 目录以及 STATICFILES_DIRS 指定的目录中收集静态文件,并将它们复制到 STATIC_ROOT 指定的目录下。这样做的目的是为了在生产环境中集中存放所有静态文件,以便于 Web 服务器更有效地提供它们。
这里要提问:Django在执行命令:python manage.py collectstatic 时,如果多个应用的static文件中包含了名字相同但内容不一样的css文件怎么办?
答:如果多个应用的static文件中包含了名字相同但内容不一样的CSS文件,collectstatic 默认情况下会根据应用的顺序覆盖早先的文件。这意味着在同一静态文件目录中,后面的应用的同名文件会覆盖前面应用的同名文件。
如果你想要保留所有同名文件,可以在每个应用的static目录下创建子目录,将文件放置在这些子目录中。collectstatic 将会保持目录结构,因此同名文件不会相互覆盖。
例如:

myapp1/static/myapp1/css/style.cssmyapp2/static/myapp2/css/style.css

在这种情况下,collectstatic 将会在静态文件目录中创建以下结构:

static_root/myapp1/css/style.cssmyapp2/css/style.css

这样做可以确保同名文件不会相互覆盖。
所以为了方便生产环境的部署,建议大家按上面的说明在应用目录的static下再建一个名称为应用名称的目录后,再放静态文件,这样避免在进行生产环境部署时产生麻烦。 当然如果你的整个django项目如果只有一个应用,那也不用这样,不过万一有一天你想增加应用呢?

好了,说回来。当执行命令 python manage.py collectstatic后,Django在加载HTML模板文件时对于静态文件的查找则变成了下面的顺序来进行了(注意:此时与第1种情况的顺序有很大的区别了):

  1. STATIC_ROOT中的静态文件
    Django 会首先查找STATIC_ROOT目录中是否存在所需的静态文件。这是因为STATIC_ROOT是用于收集所有静态文件的根目录,它们都被复制到这个目录下。
    具体来说,这里:

    STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
    

    所以会去查找由 BASE_DIR/static_root/ 和 bootstrap-4.5.3-dist/css/bootstrap.css 组成的路径,即路径:BASE_DIR/static_root/bootstrap-4.5.3-dist/css/bootstrap.css,也就是路径 F:/dj_pro/static_root/bootstrap-4.5.3-dist/css/bootstrap.css。如果找到了文件bootstrap.css,则停止查找,如果没有找到,继续往下找。

  2. STATICFILES_DIRS中的静态文件
    如果在STATIC_ROOT中找不到所需的静态文件,Django 将在STATICFILES_DIRS指定的目录列表中进行查找。
    具体来说,这里:

    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_list')]  # 注意这是一个列表,即可以有多个目录的路径
    

    所以会到由 BASE_DIR/static_list/ 和 bootstrap-4.5.3-dist/css/bootstrap.css 组成的路径,即路径:
    BASE_DIR/static_list/bootstrap-4.5.3-dist/css/bootstrap.css,也就是路径:F:/dj_pro/static_list/bootstrap-4.5.3-dist/css/bootstrap.css 中去查找文件bootstrap.css。
    如果找到了文件bootstrap.css,则停止查找,如果没有找到,继续往下找。

  3. 各个应用的static目录
    如果在以上步骤中都找不到所需的静态文件,Django 将在各个应用的static目录中查找。每个Django应用通常都有一个static目录,用于存放该应用的静态文件。
    具体来说,由于我的应用名字为app1,所以会去查找由BASE_DIR/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css组成的路径。即路径:BASE_DIR/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css,也就是路径:F:/dj_pro/app1/static/bootstrap-4.5.3-dist/css/bootstrap.css 中是否存在文件bootstrap.css。
    如果找到了文件bootstrap.css,则停止查找静态文件bootstrap.css。如果此时仍没有找到,则停止查找。

读懂了上面对具体过程的介绍下,相信大家也就知道了本文开头给出的三条语句的作用了,也知道了Django的HTML模板的静态文件查找和加载机制了。

一些补充和自己的心得:
①网上看到的,自己没试:如果要变量static起作用,那么要加载应用 ‘django.contrib.staticfiles’,比如下面的配置代码:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app1',  # 这是自己创建的应用,需要手动注册
]

应用 'django.contrib.staticfiles’在Django创建好项目时就默认添加的,自己不主动删除就没问题。

②如果静态文件不多、不大,个人感觉没必要执行语句 python manage.py collectstatic

③养成在各应用的static下再建一个名字为应用名字的文件夹后再放静态文件的习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/197330.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CImage通过WinApi的SetWorldTransform来实现图片旋转

SetWorldTransform的功能是旋转画布&#xff0c;这样产生的效果就是图像旋转。因此&#xff0c;在旋转画布之前&#xff0c;要把要旋转的图像的位置和大小准备好&#xff0c;这样旋转之后&#xff0c;才能使图像正好出现在显示区域内。这需要计算两个关键参数&#xff0c;图像的…

Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

如何进行手动脱壳

脱壳的目的就是找到被隐藏起来的OEP&#xff08;入口点&#xff09; 这里我一共总结了三种方法&#xff0c;都是些自己的理解希望对你们有用 单步跟踪法 一个程序加了壳后&#xff0c;我们需要找到真正的OEP入口点&#xff0c;先运行&#xff0c;找到假的OEP入口点后&#x…

SpringBoot 整合 JdbcTemplate(配置多数据源)

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

家电电器展示预约小程序的作用是什么

电器产品已经成为人们生活的必备品&#xff0c;如冰箱、电视机、洗衣机等&#xff0c;而这些产品的购买方式也很多&#xff0c;可以到线下门店购买&#xff0c;也可以到线上多个电商平台购买&#xff0c;如今互联网高速发展以及民众享受线上服务带来的便捷性&#xff0c;同时商…

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

MySql操作

Mysql数据库项目学习笔记 1.条件查询后排序 (SELECT counter : 0) temp设定临时变量ORDER BY id ASC用于将id以升序形式进行排列 SELECTcounter : counter 1 AS ROW,username,type,content FROMtest_info,( SELECTcounter : 0 ) temp WHEREusername 2 AND type 3 ORDER BYi…

网络文件共享服务(ftp和nfs)和如果用局域网搭建yum仓库

存储类型 存储类型分三种 1.直连式存储&#xff1a;DAS 2.存储区域网络&#xff1a;SAN 3.网络附加存储&#xff1a;NAS FTP文件传输协议 软件要利用协议&#xff0c;协议时通过应用程序实现的 各协议端口 ftp &#xff1a;20&#xff08;数据&#xff09; 21&#xff0…

好的CRM系统有哪些核心能力?

CRM是企业管理的重要工具&#xff0c;可以维护管理客户关系&#xff0c;提高企业的核心竞争力。市场营销、销售、客户服务和技术支持等相关领域都需要用到CRM系统。那么一个好的CRM&#xff0c;最核心的能力有哪些&#xff1f; 1.销售自动化 这里简单介绍下销售自动化的功能&…

值得学习的演示文稿制作范例

1,在第一张幻灯片前插入1张新幻灯片,设置幻灯片大小为“全屏显示(16:9) ”;为整个演示文稿应用“离子会议室”主题,放映方式为“观众自行浏览”;除了标1题幻灯片外其它每张幻灯片中的页脚插入“晶泰来水晶吊坠”七个字。 2,第一张幻灯片的版式设置为“标题幻灯片”,主标题为“…

MPN在QM中的使用

此文章为机器翻译SAP BLOG 文章&#xff0c;原文地址&#xff1a;Manufacturer Part Profile in QM | SAP Blogs 目的&#xff1a;–材料管理 (MM) 组件支持从不同供应商采购制造商特定的零件或材料。如果您实施制造商零件编号 (MPN) 处理功能&#xff0c;您还可以在质量管理 …

采集淘宝天猫整店商品api(店铺列表、店铺所有商品)

返回数据&#xff1a;请求链接 {"items": {"shop_id": "336945718","page": "1","real_total_results": "75","total_results": "75","page_size": 10,"page_coun…