Django | 静态文件处理

Django: 1.8.7

在使用 django 开发中,不可避免的总会遇到静态文件的处理,特别对于前端来说,页面的调试都是依赖静态文件(JS,CSS,Image等等),Django 在静态文件处理这一块做的不错,但不是最优秀,毕竟 Django 只是一个框架而已,更多的业务需要搭配其他工具共同完成,这是后话。

1 文件分类

Django 把静态文件分成了两类:staticmedia,看了 Django 的文档之后,发现 Django 是按照是否与用户互动来进行区分的

  • static: 应用页面需要的(JS, CSS, Image...),这些相对来说是提供给用户的,即这些文件(非严格讲)没有与用户进行互动,开发者产生这些文件为访问用户服务,用户只是单纯的享受应用服务。

  • media: 用户与应用程序进行交互的文件(用户上传的文件等等)

2 static 文件

Django 使用下面几项来处理 static 文件

  • STATIC_ROOT

  • STATIC_URL

  • STATICFILES_DIRS

  • STATICFILES_STORAGE

  • STATICFILES_FINDERS

每一项的具体作用不写了,不懂的可以去翻看官方文档,已经非常清晰。

2.1 开发环境

2.1.1 在自定义的 STATICFILES_DIRS 寻找静态文件

以下是我使用的方式:推荐

  • 保证 django.contrib.staticfilesINSTALLED_APPS 中.

  • TEMPLATES 配置中添加 django.template.context_processors.static

  • 在模板中使用 STATIC_URL 变量,eg:<img src="{{STATIC_URL}}girl.png>

2.1.2 在自定义的 STATIC_ROOT 寻找静态文件

如果你想访问静态文件时,静态文件在 STATIC_ROOT 中寻找

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这种方法不推荐,理由:开发过程中需要不断的执行 ./manage.py collectstatic

2.2 生产环境

生产环境不同开发环境,生产环境下(DEBUG=False),django.contrib.staticfiles 是不起任何作用的,也就说 django.contrib.staticfiles 只对开发环境(DEBUG=True)开启

生产环境我们一般都是使用 web服务器 来管理静态文件,管理方法就不写了,不懂可以翻看文档

2.3 CDN 服务

根据配置文件的不同(develop.py production.py), 设置不同的 STATIC_URL, 这样很容易结合 CDN 服务,生产环境配置 CDN,这就扯到高并发去了

2.4 开发环境下默认静态文件服务运行原理

这个原理很简单,因为 django.contrib.staticfilesINSTALLED_APPS 中,Django 自动加载 django.contrib.staticfilesurls.py, urls.py 源代码如下:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.views import serve

urlpatterns = []


def staticfiles_urlpatterns(prefix=None):
    """
    Helper function to return a URL pattern for serving static files.
    """
    if prefix is None:
        prefix = settings.STATIC_URL
    return static(prefix, view=serve)

# Only append if urlpatterns are empty
if settings.DEBUG and not urlpatterns:
    urlpatterns += staticfiles_urlpatterns()

重点是 staticfiles_urlpatterns 这个函数,自动把 settings.STATIC_URL 作为前缀,这些细节我们都不用管,Django 都帮我们搞好了

3 media 文件

media 这里不仅仅包含多媒体文件,包括用户上传的文档,自定义的 css 等等

Django 使用下面几项来处理 media 文件

  • MEDIA_ROOT

  • MEDIA_URL

3.1 开发环境

以下是我使用方式

  • 在 TEMPLATES 配置中添加 django.template.context_processors.media

  • 修改 urls.py 入口文件

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
  • 在模板中直接使用 MEDIA_URL 变量.

<video width="320" height="240" controls="controls">
  <source src="{{ MEDIA_URL }}movie.ogg" type="video/ogg">
  <source src="{{ MEDIA_URL }}movie.mp4" type="video/mp4">
</video>

3.2 生产环境

2.2

3.3 小结 media

其实严格来说 media 文件都是静态文件,静态文件的打包,版本控制等等需要借助其他工具来完成(前端工程范畴),跟 static 最大的区别是否由用户产生,仅此而已。Django-1.3 之前统一使用 media 进行管理,至于为了还会分出上面类型,不能预测

4 总结

随着现代前端工程的发展,Django 处理静态资源不能满足我们的需要,当下还需要结合其他工具共同完成日益复杂的前端工程。


黑月亮
点滴记录,步步成长

现实与完美之间

1.6k 声望
24 粉丝
0 条评论
推荐阅读
centos | 修改静态 IP
设置 Centos 为使用静态 IP1 修改网络配置 {代码...} 修改后的内容如下 {代码...} 2 重启网络服务 {代码...} 3 查看地址 {代码...} 参考来源:[链接]

青阳半雪阅读 1.8k评论 3

三、djanjo
Django 提示:本文根据b站黑马python课整理链接指引 =&gt; 黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》视图介绍和项目准备视图介绍视图就是应用中views.py文件中的函数视图的第一个参数必须为H...

玲小叮当阅读 934

Django笔记二十二之多数据库操作
在第十篇笔记的时候,简单介绍过 using() 的使用方法,多个数据库就是通过 using(db_alias) 的方式来来指定选中的数据库,这里介绍一下同步库表结构时候的操作。

Hunter阅读 815

封面图
Django笔记十三之select_for_update等选择和更新等相关操作
本篇笔记将介绍 update 和 create 的一些其他用法,目录如下:get_or_createupdate_or_createselect_for_updatebulk_createbulk_update1、get_or_create前面我们介绍过 get() 和 create() 的用法,那么 get_or_cr...

Hunter阅读 759

封面图
Django笔记十二之defer、only指定返回字段
defer 的英语单词的意思是 延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些 textfield 字段上。

Hunter阅读 718

封面图
Django笔记十四之统计总数、最新纪录和空值判断等功能
本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。countin_bulklatest、earliestfirst、lastexistscontains、icontainsgt、gte、lt、ltestartswith、istartswithisnull1、count返回查询的 Q...

Hunter阅读 671

封面图
Django笔记六之外键ForeignKey介绍
这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法。这是一种一对多的字段类型,表示两张表之间的关联关系。本篇笔记的目录如下:on_deleterelated_namerelated_query_name外键字段的...

Hunter阅读 663

现实与完美之间

1.6k 声望
24 粉丝
宣传栏