Django的STATIC_ROOT和STATIC_URL以及STATICFILES_DIRS

本文介绍了如何在Django项目中配置静态文件,包括STATIC_ROOT、STATICFILES_DIRS和STATIC_URL的作用及配置方法,并解释了这些设置如何使静态文件能在浏览器中被正确访问。
首先,我们配置静态文件,要在setting.py里面加入如下几行代码: 
settings.py

# the settings above
# STATIC SETTINGS
STATIC_URL = '/static/'
# BASE_DIR 是项目的绝对地址
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
#以下不是必须的
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'common_static'),
) 

1.STATIC_ROOT

STATIC_ROOT 是在部署静态文件时(pyhtonmanage.pycollectstatic)所有的静态文静聚合的目录,STATIC_ROOT要写成绝对地址,在这里,比如我的项目mysite是/home/mysite/ 
那么STATIC_ROOT 为 /home/mysite/collect_static/ 
当部署项目时,在终端输入:

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

2.STATICFILES_DIRS

STATIC_ROOT 是在部署的时候才发挥作用, 而实际情况下,静态文件的一般安放位置有两种:

1.一种就是在每个app里面新建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(所以,不要把文件夹的名字写错哦, 否则django就找不到你的文件夹了)

2.另一种,就是在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为最后所有的静态文件都会在STATIC_ROOT里面存在) 
那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,那就需要配置STATICFILES_DIRS了

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

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

3.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来让浏览器可以直接访问静态文件,比如:

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

所以在浏览器上,利用前缀 STATIC_URL的具体内容,来映射STATIC_ROOT, 
HTTP://192.168.1.2:8000/static 相当于 本地地址的STATIC_ROOT
### Django 中 `STATIC_URL` `STATICFILES_DIRS` 的配置说明及区别 #### 配置说明 #### STATIC_URL 设置 `STATIC_URL` 指定了在开发生产环境中访问静态文件的URL前缀。每当在模板中使用 `{% static 'path/to/file' %}` 时,Django 将此路径 `STATIC_URL` 组合,从而生成完整的 URL[^1]。 例如,在 settings.py 文件中的定义可以是: ```python STATIC_URL = '/static/' ``` 这意味着任何通过 `{% static %}` 标签引用的资源都会被映射到 `/static/` 下面的位置。 对于 HTML 页面来说,如果有一个图片位于项目的某个位置,并且想要链接它,则可以在模板里这样写: ```html <img src="{% static 'images/myphoto.jpg' %}" alt="My Photo"> ``` 这最终会被解析成类似于 `<img src="/static/images/myphoto.jpg" />`. #### STATICFILES_DIRS 设置 另一方面,`STATICFILES_DIRS` 提供了一个列表来指定额外查找静态文件的地方。默认情况下,应用程序内部名为 `static` 的子目录也会被纳入考虑范围之内;但是有时候可能希望集中管理多个应用共有的静态资产或者放置一些不属于任何一个特定应用但仍然需要服务给客户端浏览器查看的内容。这时就可以利用 `STATICFILES_DIRS` 来扩展这些源目录[^2]。 一个典型的例子是在 settings.py 中添加如下代码片段: ```python import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent STATICFILES_DIRS = [ BASE_DIR / "common_static", ] ``` 上述设置意味着除了各个 app 自带的 `static` 文件夹外,还会从根目录下的 `common_static` 文件夹收集静态文件。 #### 主要区别 - **目的不同**: `STATIC_URL` 关注的是如何构建对外提供下载使用的 URI 路径模式,而 `STATICFILES_DIRS` 则关心本地磁盘上哪些地方存有应该被打包并上传至 CDN 或者其他远程存储系统的实际物理文件。 - **应用场景差异**: 开发阶段通常只需要调整好 `STATIC_URL`, 让开发者能够方便快捷地测试样式表、JavaScript 库等功能即可。然而到了部署环节,就需要认真规划 `STATICFILES_DIRS` ,以便于自动化工具如 `collectstatic` 命令能顺利找到所有待发布的素材并将它们复制到由 `STATIC_ROOT` 指定的目标位置[^4].
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值