django特殊文件管理之Static和Media异同之处
异同之处
相同之处
都是用来管理Django中的一些特殊文件,比如js文件、css文件、图片文件等等
不同之处
1、文件类别
不同
- static 是静态文件,是在项目上线之前就需要准备好的,一些基础必备文件,比如需要的js文件、css文件,网站logo图片、用户的默认头像等
- media 是
动态文件
, 指的是项目上线之后,从网站上传的文件、图片、音视频等,比如 用户上传更新自己的新头像图片、用户上传的视频课程等
2、配置参数不同
media 配置简单,只需要两个系统参数
MEDIA_URL
和MEDIA_ROOT
MEDIA_URL 是 上传类文件、图片的
URI前缀
, 比如 http://127.0.0.1:8080/media/cover/xxx.jpgMEDIA_ROOT 是上传类文件、图片实际在服务器上存储的目录
static 涉及到Django对于
文件管理
相关,配置较为复杂。一般在开发阶段,我们配置STATIC_URL
和STATICFILES_DIRS
两个参数, 在生产环境的时候会配置STATIC_ROOT
STATIC_URL 静态文件URI前缀
STATICFILES_DIRS 静态文件存放的位置,该配置是个List类型,可以配置多个路径,而且路径可以配置别名;另外因为Django默认安装了
django.contrib.staticfiles
应用。所以在查找静态文件的时候,除了STATICFILES_DIRS
配置文件路径,也会去应用APP目录下的static
目录查找STATIC_ROOT 是最终上线的时候,通过
collectstatic
命令把相关的静态文件收集到 该配置的绝对路径下,最终通过web server(比如nginx)
来指定静态文件路径,方便备份和管理
Media 说明
demo核心代码
1 | # demoapp/models.py |
修改admin.py
把 TestMedia 注册到 Admin后台
然后执行 数据库修改和创建超级管理员账号
1 | # 数据库初始化 |
然后登录Admin后台,创建一个 TestMedia 的记录,编辑的时候如图所示
看到专题封面
和 专题视频
这里有两个地址,点击任何一个,正常情况应该展示一个封面图片或者一个视频(这里用一个压缩文件代替)。但是实际是报错404提示资源不存在
这里我们先做个STATIC的试验,作为对照说明MEDIA和STATIC的不同之处
我们先来配置下STATIC_URL
和 STATICFILES_DIRS
,然后再对应的目录下存放一个照片做测试
1 | STATIC_URL = '/static/' |
测试图片 ./statics/images/fox.jpeg
, 它对应的地址是 http://127.0.0.1:8003/static/images/fox.jpeg 我们在浏览器打开它,发现是正常
思考: 为什么上传的 media资源打不卡,而配置的 static 资源是默认能打开的呢
喝杯茶,休息休息… …
喝杯茶,休息休息… …
喝杯茶,休息休息… …
答案揭晓
在文章开始介绍STATICFILES_DIRS
的时候,我们讲到了一个 django.contrib.staticfiles
,默认的静态文件 static 前缀URL解析就是通过这个APP进行的解析。
可以通过如下命令验证,
1 | python manage.py runserver 127.0.0.1:8003 --nostatic |
启动服务再去访问那个 fox 图片这个时候就提示找不到,官方文档参考
在回过头来说明MEDIA 404的问题
从上面的试验得知, STATIC 默认Django是通过 django.contrib.staticfiles
提供了默认的 URL配置,但是 MEDIA 是没有的,需要单独配置,如下
1 | # demo_media_static/settings.py |
然后再请求上面的404地址http://127.0.0.1:8003/media/covers/WechatIMG128.jpeg 这个时间就能正常显示
Static 说明
用到的核心参数有 STATIC_URL
、 STATIC_ROOT
和 STATICFILES_DIRS
,具体说明前面在 异同对比的时候已经说明过了。这里不在介绍
这里重点介绍在template
中如何使用。
公共的静态文件我们一般方式在项目根目录下的
statics
文件夹,也就是STATICFILES_DIRS
配置的另外可以在具体应用APP下创建
static
目录,在 template 中使用的时候一般需要先导入
1 | <!-- 如果有extends 的时候, load static 需要放到这个后面--> |
- 还有一种方式可以不用再 template中 手动 load
1 | # demo_media_static/settings.py |
- 然后再template实际使用如下
1 | ... ... |
- 对应的 URL地址为 http://127.0.0.1:8003/static/css/base.css
更多信息请参考: 官方文档参考
扩展说明
1、最后实际项目发布生产环境的时候,会通过 Web server(比如nginx)
来单独统一管理静态文件。
定义
STATCI_ROOT
执行
python manage.py collectstatic
把相关的静态文件都收集到STATIC_ROOT
定义的绝对路径下配置nginx,对 css/js/image 类的 请求单独一个 location 转发到
STATIC_ROOT
定义的目录下去
2、给URL路径定义名别
1 | STATICFILES_DIRS = [ |
如上配置,在请求 medias/files 下面的文件的时候,除了 http://127.0.0.1:8003/static/hadoop_exporter.tar.gz
访问之外,还可以使用 http://127.0.0.1:8003/static/downloads/hadoop_exporter.tar.gz
注意这里的downlaods
是定义的别名
该案例对应的项目源代码 需要的请自行下载
django特殊文件管理之Static和Media异同之处
http://blog.colinspace.com/2022/09/28/django特殊文件管理之Static和Media异同之处/