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

news2025/1/8 11:48:21

在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.css

myapp2/
    static/
        myapp2/
            css/
                style.css

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

static_root/
    myapp1/
        css/
            style.css
    myapp2/
        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.coloradmin.cn/o/1241254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品

简介&#xff1a; 气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品包括中国2001~2018年地表短波波段反照率、植被光合有效辐射吸收比、叶面积指数、森林覆盖度和非森林植被覆盖度、地表温度、地表净辐射、地表蒸散发、地上部分自养呼吸、地下部分自养呼吸、总初级…

PTA-6-45 工厂设计模式-运输工具

题目如下&#xff1a; 工厂类用于根据客户提交的需求生产产品&#xff08;火车、汽车或拖拉机&#xff09;。火车类有两个子类属性&#xff1a;车次和节数。拖拉机类有1个子类方法耕地&#xff0c;方法只需简单输出“拖拉机在耕地”。为了简化程序设计&#xff0c;所有…

Python之pyc文件的生成与反编译

目录 1、什么是pyc文件 2、手动生成pyc文件 3、pyc文件的执行 4、pyc文件的反编译 1、什么是pyc文件 pyc文件&#xff08;PyCodeObject&#xff09;是Python编译后的结果。当python程序运行时&#xff0c;编译的结果是保存于PyCodeObject&#xff0c;程序运行结束后&#x…

009 OpenCV threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

webAPI serial——串口连称

重点 关闭正在读的串口 借鉴文章:webapi串口 async closeport() {this.$emit("changeSerialStatus", false);//这里要注意&#xff0c;一定要关闭读取this.status false;//取消后&#xff0c;done会变成true&#xff0c;会执行reader.releaseLock();this.reader.c…

ESP32 MicroPython 颜色及二维码识别⑫

ESP32 MicroPython 颜色及二维码识别⑫ 1、颜色识别2、二维码识别 1、颜色识别 使用AI颜色识别功能&#xff0c;可以实现颜色辨别、颜色追踪等应用。颜色识别模型内置有9种常见的颜色识别和一种颜色学习识别模式。他们分别是&#xff1a; ai.COLOR_RED 表示识别红色 ai.COLOR…

【C语言】深入解开指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

使用 PowerShell 创建共享目录

在 Windows 中&#xff0c;可以使用共享目录来将文件和文件夹共享给其他用户或计算机。共享目录可以通过网络访问&#xff0c;这使得它们非常适合用于文件共享、协作和远程访问。 要使用 PowerShell 创建共享目录&#xff0c;可以使用 New-SmbShare cmdlet。New-SmbShare cmdl…

【C++高阶(四)】红黑树深度剖析--手撕红黑树!

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 红黑树 1. 前言2. 红黑树的概念以及性质3. 红黑…

图像分类原理

一、什么是图像分类(Image Classification) 图像分类任务是计算机视觉中的核心任务&#xff0c;其目标是根据图像信息中所反映的不同特征&#xff0c;把不同类别的图像区分开来。 二、图像分类任务的特点 对于人来说&#xff0c;完成上述的图像分类任务简直轻而易举&#xf…

Elasticsearch:FMA 风格的向量相似度计算

作者&#xff1a;Chris Hegarty 在 Lucene 9.7.0 中&#xff0c;我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在&#xff0c;我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算&#xff0c;…

聚观早报 |快手Q3营收;拼多多杀入大模型;Redmi K70E开启预约

【聚观365】11月23日消息 快手Q3营收 拼多多杀入大模型 Redmi K70E开启预约 华为nova 12系列或下周发布 亚马逊启动“AI就绪”新计划 快手Q3营收 财报显示&#xff0c;快手第三季度营收279亿元&#xff0c;同比增长20.8%&#xff1b;期内盈利21.8亿元&#xff0c;去年同期…

梁培强:塑造下一代投资高手

在当前全球经济动荡和金融市场快速变化的背景下&#xff0c;梁培强的投资教育计划不仅仅是一套课程&#xff0c;它是对传统投资理念的深度挑战和革新。梁培强&#xff0c;拥有超过二十年金融行业经验的资深分析师&#xff0c;正在引领一场投资者教育的变革&#xff0c;旨在培养…

基于深度学习的文本分类

通过构建更复杂的深度学习模型可以提高分类的准确性&#xff0c;即分别基于TextCNN、TextRNN和TextRCNN三种算法实现中文文本分类。 项目地址&#xff1a;zz-zik/NLP-Application-and-Practice: 本项目将《自然语言处理与应用实战》原书中代码进行了实现&#xff0c;并在此基础…

Oracle的控制文件多路复用,控制文件备份,控制文件手工恢复

一.配置控制文件多路复用 1.查询Oracle的控制文件所在位置 SQL> select name from v$controlfile;NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/fast_recovery_a…

SpringBoot集成七牛云OSS详细介绍

&#x1f4d1;前言 本文主要SpringBoot集成七牛云OSS详细介绍的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&a…

geemap学习笔记012:如何搜索Earth Engine Python脚本

前言 本节主要是介绍如何查询Earth Engine中已经集成好的Python脚本案例。 1 导入库 !pip install geemap #安装geemap库 import ee import geemap2 搜索Earth Engine Python脚本 很简单&#xff0c;只需要一行代码。 geemap.ee_search()使用方法 后记 大家如果有问题需…

进程间通信(管道/消息队列/共享内存/信号量)

目录 一、进程间通信介绍1.1 进程间通信的目的1.2 进程间通信的发展1.3 进程间通信的分类 二、管道2.1 什么是管道&#xff1f;2.2 匿名管道2.3 实现匿名管道通信的代码2.4 用fork来共享管道原理2.5 站在文件描述符角度-深度理解管道2.6 站在内核角度-管道本质2.7 管道读写的规…

2023 年 亚太赛 APMCM (C题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 问题一 为了分析中国新能源电动汽车发展的主要因素&#xf…

电线电缆行业生产管理怎么数字化?

行业介绍 随着市场环境的变化和现代生产管理理念的不断更新&#xff0c;电缆的生产模式也在发生转变&#xff0c;批量小&#xff0c;规格多&#xff0c;交期短的新型制造需求逐年上升&#xff0c;所以企业车间管理的重要性越发凸显&#xff0c;作为企业良性运营的关键&#xf…