美文网首页Django
django特殊文件管理之Static和Media异同之处

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

作者: 菩提老鹰 | 来源:发表于2022-09-29 18:09 被阅读0次
    WechatIMG136.jpeg

    异同之处

    相同之处

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

    不同之处

    1、文件类别不同

    • static 是静态文件,是在项目上线之前就需要准备好的,一些基础必备文件,比如需要的js文件、css文件,网站logo图片、用户的默认头像等
    • media 是动态文件, 指的是项目上线之后,从网站上传的文件、图片、音视频等,比如 用户上传更新自己的新头像图片、用户上传的视频课程等

    2、配置参数不同

    • media 配置简单,只需要两个系统参数 MEDIA_URLMEDIA_ROOT

    • static 涉及到Django对于文件管理相关,配置较为复杂。一般在开发阶段,我们配置 STATIC_URLSTATICFILES_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核心代码

    # 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 中如何使用。

    • 公共的静态文件我们一般方式在项目根目录下的 statics 文件夹,也就是 STATICFILES_DIRS 配置的

    • 另外可以在具体应用APP下创建 static 目录,

    • 在 template 中使用的时候一般需要先导入

    <!-- 如果有extends 的时候, load static 需要放到这个后面-->
    {% extends 'base.html' %}
    {% load static %}
    
    • 还有一种方式可以不用再 template中 手动 load
    # demo_media_static/settings.py
    
    TEMPALTES = [
        {
            ... ...,
            'OPTIONS': {
                'context_processors': [... ...],
                
            },
            # 添加如下,可以不用再template中每次都 {% load static %}
            'builtins': [
                'django.templatetags.static',
            ]
        }
    ]
    
    • 然后再template实际使用如下
    ... ...
    <!-- 实际文件位于 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>
    ...
    
    • 对应的 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路径定义名别

    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 是定义的别名


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

    相关文章

      网友评论

        本文标题:django特殊文件管理之Static和Media异同之处

        本文链接:https://www.haomeiwen.com/subject/rjukartx.html