事关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.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下再建一个名字为应用名字的文件夹后再放静态文件的习惯。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决开着代理情况下pip或魔搭下载失败

解决开着代理情况下pip或魔搭下载失败 一、前言 最近由于经常配环境导致&#xff0c;老是要来回切clash关掉代理&#xff0c;非常的不方便 如下面的&#xff0c;魔搭模型下载失败 ValueError: invalid model repo path HTTPSConnectionPool(host‘www.modelscope.cn’, port4…

Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126

一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…

【github】初学者使用指南

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

关于2023年11月25日PMI认证考试准考信下载及考场规定等事项通知

各位考生&#xff1a;为保证参加2023年11月25日PMI项目管理资格认证考试的每位考生都能顺利进入考场参加考试&#xff0c;请完整阅读本通知内容。 一、关于准考信下载为确保您顺利进入考场参加11月份考试&#xff0c;请及时登录本网站个人系统下载并打印准考信&#xff0c;准考…

CKD TransBTS:用于脑肿瘤分割的具有模态相关交叉注意的临床知识驱动混合转换器

CKD-TransBTS: Clinical Knowledge-Driven Hybrid Transformer With Modality-Correlated Cross-Attention for Brain Tumor Segmentation CKD TransBTS&#xff1a;用于脑肿瘤分割的具有模态相关交叉注意的临床知识驱动混合转换器背景贡献实验方法how radiologists diagnose b…

风丘电动汽车热管理方案 为您的汽车研发保驾护航

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

策略模式实践

目录 前言 五个部分 名词解释 代码 controller层 HelloService接口 实现类 自定义注解 上下文 策略工厂 Java SPI配置 验证 前言 五个部分 接口、实现类、自定义注解、上下文、策略工厂 名词解释 自定义注解(方便后期增加实现类后灵活控制策略) 上下文(初始化…

深入了解Java 8 新特性:Stream流的实践应用(二)

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概8000多字&#xff0c;预计阅读时间长需要10分钟&#xff08;不要害怕字数过多&#xff0c;其中有一大部分是示例代码&#xff0c;读起…

怎么批量提取文件名字到Excel中?

怎么批量提取文件名字到Excel中&#xff1f;Excel是由微软公司开发的一种电子表格软件&#xff0c;它是Microsoft Office办公套件的一部分。Excel提供了强大的数据处理和分析功能&#xff0c;用户可以使用Excel创建、编辑和管理电子表格&#xff0c;进行各种计算、数据分析、图…

2024测试工程师必学的Jmeter:利用jmeter插件收集性能测试结果汇总报告和聚合报告

利用jmeter插件收集性能测试结果 汇总报告&#xff08;Summary Report &#xff09; 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍&#xff1a; 所有数据写入一个文件&#xff1a;保存测试结果到本地…

通过AppLink把拼多多热门榜单商品同步至小红书

上篇说到AppLink当中定时调度方式如何配置&#xff0c;这次来演示一下&#xff0c;如何把热门榜单信息同步至小红书 1.拉取一个定时器作为触发动作&#xff0c;通过配置定时器调度时间将定时策略配置为每天执行一次 2.触发动作完成后通过好单库获取拼多多每日热门榜单&#xf…

steamui.dll找不到指定模块,要怎么修复steamui.dll文件

当我们使用Steam进行游戏时&#xff0c;有时可能会面对一些令人无奈的技术问题。一种常见的问题是“找不到指定模块steamui.dll”&#xff0c;这可能是由于缺少文件、文件损坏或软件冲突等原因导致。但别担心&#xff0c;这篇文章将提供几种解决此问题的方法&#xff0c;并针对…

“KeyarchOS:国产Linux新星的崛起与创新之路“

简介 KeyarchOS是一款由浪潮信息自主研发的服务器操作系统。它因为几个特点而受到我的青睐和一些用户的关注。 首先&#xff0c;KeyarchOS注重安全性和稳定性。它有一些防护和隔离功能&#xff0c;来帮助系统稳定运行&#xff0c;而且是中文语言更接地气。 其次&#xff0c;Ke…

基于Android校园交流uniAPP+vue 微信小程序v7e1

本系统结合现今XX校园交流APP的功能模块以及设计方式进行分析&#xff0c;使用Android平台和Ssm框架进行开发设计&#xff0c;具体研究内容如下&#xff1a; (1) 系统管理员主要对用户管理、类型管理、娱乐天地管理、投诉举报管理、学习平台、我的收藏管理、系统管理等功能进…

【设计模式】行为型设计模式

行为型设计模式 文章目录 行为型设计模式一、概述二、责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;三、命令模式&#xff08;Command Pattern&#xff09;四、解释器模式&#xff08;Interpreter Pattern&#xff09;五、迭代器模式&#xff08;Iterato…

蓝桥杯物联网_STM32L071_1_CubMxkeil5基础配置

CubMx配置&#xff1a; project工程中添加.h和.c文件&#xff1a; keil5配置: 运行&#xff1a; 代码提示与解决中文乱码&#xff1a;

想面试前端工程师,必须掌握哪些知识和技能?【云驻共创】

在当今的数字化时代&#xff0c;前端工程师扮演着至关重要的角色。他们负责设计和开发用户界面&#xff0c;使得用户能够与应用程序或网站进行互动。为了找到最出色的前端工程师&#xff0c;你需要了解哪些技能和知识是必备的&#xff0c;同时也要掌握一些面试技巧和常见的面试…

谷歌浏览器任意文件访问漏洞(CVE-2023-4357)复现

1.漏洞级别 高危 2.漏洞描述 该漏洞的存在是由于 Google Chrome中未充分验证 XML 中不受信任的输入。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制&#xff0c;导致chrome任意文件读取。 总结&#xff1a;一个XXE漏洞 3.利用范围 Google Chrome < 116.…

亚马逊运营一定要用动/静态住宅IP代理吗?

作为全球最大的电商平台之一&#xff0c;亚马逊已经成为许多商家的首选销售平台。而代理IP作为近几天互联网的热门工具&#xff0c;在跨境电商界也起着非常强大的作用。那么在亚马逊运营中&#xff0c;适合动态住宅代理还是静态住宅代理呢&#xff1f;下面我们一起来探索&#…

普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…