Django

django特殊文件管理之Static和Media异同之处

2022-09-29  本文已影响0人  菩提老鹰
WechatIMG136.jpeg

异同之处

相同之处

都是用来管理Django中的一些特殊文件,比如js文件、css文件、图片文件等等

不同之处

1、文件类别不同

2、配置参数不同

Media 说明

demo核心代码

# demoapp/models.py
class TestMedia(models.Model):
    name = models.CharField(max_length=32, verbose_name="专题名称")
    cover = models.ImageField(upload_to='covers/', verbose_name="专题封面")
    video = models.FileField(upload_to='vedios/', verbose_name="专题视频")

    def __str__(self):
        return self.name 

修改admin.py 把 TestMedia 注册到 Admin后台

然后执行 数据库修改和创建超级管理员账号

# 数据库初始化
python manage.py makemigrations
python manage.py migrate

# 创建超级管理员账号
python manage.py createsuperuser

# 运行 dev server
python manage.py runserver 127.0.0.1:8003

然后登录Admin后台,创建一个 TestMedia 的记录,编辑的时候如图所示

django-media-static-03.png

看到专题封面专题视频 这里有两个地址,点击任何一个,正常情况应该展示一个封面图片或者一个视频(这里用一个压缩文件代替)。但是实际是报错404提示资源不存在

django-media-static-01.png

这里我们先做个STATIC的试验,作为对照说明MEDIA和STATIC的不同之处

我们先来配置下STATIC_URLSTATICFILES_DIRS,然后再对应的目录下存放一个照片做测试

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

测试图片 ./statics/images/fox.jpeg, 它对应的地址是 http://127.0.0.1:8003/static/images/fox.jpeg 我们在浏览器打开它,发现是正常

django-media-static-02.png

思考: 为什么上传的 media资源打不卡,而配置的 static 资源是默认能打开的呢

喝杯茶,休息休息... ...

喝杯茶,休息休息... ...

喝杯茶,休息休息... ...

答案揭晓

在文章开始介绍STATICFILES_DIRS的时候,我们讲到了一个 django.contrib.staticfiles,默认的静态文件 static 前缀URL解析就是通过这个APP进行的解析。

可以通过如下命令验证,

python manage.py runserver 127.0.0.1:8003 --nostatic

启动服务再去访问那个 fox 图片这个时候就提示找不到,官方文档参考


在回过头来说明MEDIA 404的问题

从上面的试验得知, STATIC 默认Django是通过 django.contrib.staticfiles 提供了默认的 URL配置,但是 MEDIA 是没有的,需要单独配置,如下

# demo_media_static/settings.py
# Media
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# demo_media_static/urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

然后再请求上面的404地址http://127.0.0.1:8003/media/covers/WechatIMG128.jpeg 这个时间就能正常显示


Static 说明

用到的核心参数有 STATIC_URLSTATIC_ROOTSTATICFILES_DIRS ,具体说明前面在 异同对比的时候已经说明过了。这里不在介绍

这里重点介绍在template 中如何使用。

<!-- 如果有extends 的时候, load static 需要放到这个后面-->
{% extends 'base.html' %}
{% load static %}
# demo_media_static/settings.py

TEMPALTES = [
    {
        ... ...,
        'OPTIONS': {
            'context_processors': [... ...],
            
        },
        # 添加如下,可以不用再template中每次都 {% load static %}
        'builtins': [
            'django.templatetags.static',
        ]
    }
]
... ...
<!-- 实际文件位于 statics/css/base.css -->
<link href="{% static 'css/base.css' %}" rel="stylesheet">
<!-- 实际文件位于 statics/js/bootstrap.bundle.min.js -->
<script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>
...

更多信息请参考: 官方文档参考

扩展说明

1、最后实际项目发布生产环境的时候,会通过 Web server(比如nginx) 来单独统一管理静态文件。

2、给URL路径定义名别

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'statics'),
    # 采用别名的方式配置URL地址
    # os.path.join(BASE_DIR, 'medias/files'),
    ('downloads', os.path.join(BASE_DIR, 'medias/files')),
]

如上配置,在请求 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 是定义的别名


该案例对应的项目源代码 需要的请自行下载

上一篇 下一篇

猜你喜欢

热点阅读