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

news/2024/6/18 6:00:16 标签: django, sqlite, 数据库

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

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

下面介绍这三句话的作用。

首先说第1句和第2句:

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

要明白这两句话的作用,那首先要搞清楚Django在加载HTML模板文件时对于静态文件的查找是怎么样的。

Django在加载HTML模板文件时对于静态文件的查找分为两种情况:
这两种情况根据是否执行了下面这条语句来区分:

python manage.py collectstatic

第01种-没有执行命令python manage.py collectstatic的情况
在这种情况下,Django在加载HTML模板文件时对于静态文件的查找是按下面的顺序来进行的:

  1. 各个应用的static目录
    Django 会首先查找每个应用中的 static 目录,这是默认的静态文件存放位置。每个应用通常都有一个 static 目录,用于存放该应用的静态文件。如果你在应用中创建了这样的目录,Django 将会在其中查找相应的静态文件。

  2. STATICFILES_DIRS中的静态文件
    如果在各个应用的 static 目录中找不到所需的静态文件,Django 将在 STATICFILES_DIRS 指定的目录列表中进行查找。这些目录通常包括应用中的 static 目录以及其他自定义的静态文件目录。

  3. Django提供的默认静态文件
    Django 在运行时也会提供一些默认的静态文件,例如 admin 应用的静态文件。这些文件通常不需要你手动收集,Django 会自动处理。

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

第02种-执行命令python manage.py collectstatic的情况
当运行 python manage.py collectstatic 命令时,Django 会从各个应用的 static 目录以及 STATICFILES_DIRS 指定的目录中收集静态文件,并将它们复制到 STATIC_ROOT 指定的目录下。注意:复制的时候会把相应的目录结构也复制上,而不只是静态文件哈。这样做的目的是为了在生产环境中集中存放所有静态文件,以便于 Web 服务器更有效地提供它们。

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

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

  2. STATICFILES_DIRS中的静态文件
    如果在STATIC_ROOT中找不到所需的静态文件,Django 将在STATICFILES_DIRS指定的目录列表中进行查找。这些目录通常包括应用中的static目录以及其他自定义的静态文件目录。

  3. 各个应用的static目录
    如果在以上步骤中都找不到所需的静态文件,Django 将在各个应用的static目录中查找。每个Django应用通常都有一个static目录,用于存放该应用的静态文件。

当你在模板文件中引用静态文件时,Django 使用{% static %} 模板标签来生成对应的 URL。这个标签会首先查找STATIC_ROOT,然后是STATICFILES_DIRS,最后是各个应用的static目录。

读懂了上面对“Django在加载HTML模板文件时对于静态文件的查找”的两种情况的介绍,相信您就知道了下面两句设置语句的作用了:

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

接下来说下面这条语句的作用:

STATIC_URL = '/static/'

这句话只有在Django的HTML模板中使用了如下的模板语言时才有作用:

{% static 'css/my_style.css' %}

当jango的HTML模板中使用了上面的模板语言,并在HTML模板文件的开头处写上了下面这条语句时:

{% load static %}

那么此时{% static 'css/my_style.css' %}中的static就作为是静态文件的路径前缀了,如果此时 STATIC_URL 的值用下面这条语句设定为'/mystatic/'

STATIC_URL = '/mystatic/'

那么对于语句:

{% static 'css/my_style.css' %}

代表的路径字符串为:

/mystatic/css/my_style.css

那么Django是如何去找寻文件 /mystatic/css/my_style.css 的呢?
现在作如下假设:
①我的Django项目的名字为shop,路径为:

E:/djproject/shop/

②名字为shop的Django项目只有一个应用,名叫app1,并且在app1下建立了目录static
③我通过下面这条语句设置了STATICFILES_DIRS的值为 E:/djproject/shop/static(注意:static后没有/):

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

④我通过下面这条语句设置了STATIC_ROOT的值为 E:/djproject/shop/static_root(注意:static_root后没有/):

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

那么当我还没有执行命令python manage.py collectstatic时,Django会按如下路径顺序去搜索静态资源/mystatic/css/my_style.css
①-各个应用中的static目录

E:/djproject/shop/app1/static/mystatic/css/my_style.css

②-STATICFILES_DIRS指定的目录

E:/djproject/shop/static/mystatic/css/my_style.css

当我执行了命令python manage.py collectstatic后,Django会按如下路径顺序去搜索静态资源/mystatic/css/my_style.css
①-STATIC_ROOT指定的目录:

 E:/djproject/shop/static_root/mystatic/css/my_style.css

②-STATICFILES_DIRS指定的目录

E:/djproject/shop/static/mystatic/css/my_style.css

③-各个应用中的static目录

E:/djproject/shop/app1/static/mystatic/css/my_style.css

至此,就将Django的静态资源目录设置的相关知识以及本文开始处列出的三条语句的作用说清楚了。


http://www.niftyadmin.cn/n/5195209.html

相关文章

Android图片涂鸦,Kotlin(1)

Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序…

常见树种(贵州省):003柏类

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、柏木 …

记录一个困难

Mysql加插件 create table tb_xuesheng1 as select * from tb_xuesheng; 会报如下错误 SQL 错误 [3185] [HY000]: Cant find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.当我去搜寻答案网上都说缺少插件…

《 机器人基础 》期末试卷(A)

一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…

19、动态路由_下划线为前缀的文件

创建文件 pages\users_id.vue pages\users\index.vue pages\users\one.vue 生成的路由: routes: [{path: "/users",component: _30c26dc5,name: "users"}, {path: "/users/one",component: _76252419,name: "users-one"},…

创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究

🔍📈 创新研究报告 |新业务拓展:CEO推动企业成长的必然选择 – 麦肯锡研究 🔥💼 所有执行长和商界领袖请注意!您是否正在寻找为您的组织释放成长机会的钥匙? 🌐 麦肯锡最近的一份研究…

redis问题归纳

1.redis为什么这么快? (1)基于内存操作:redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以性能比较高 (2)数据结构简单:redis的数据结构是专门设计的&…