Django 管理静态资源的四个阶段

栏目: Python · 发布时间: 7年前

内容简介:原视频:Django 处理静态资源相对而言是比较蛋疼的,该 talk 作者给我们介绍了 django app 处理静态资源的四个发展阶段(或者说场景),从最简单的单机文件系统,到前后端完全分离,希望能对你有所帮助。这种方式是最简单的,虽然效率可能相比下面介绍的要低,但是还是足够 handle 大多数业务场景,

原视频: Assets in Django without losing your hair - PyCon 2019

Django 处理静态资源相对而言是比较蛋疼的,该 talk 作者给我们介绍了 django app 处理静态资源的四个发展阶段(或者说场景),从最简单的单机文件系统,到前后端完全分离,希望能对你有所帮助。

0x01 Simple Assets

这种方式是最简单的,虽然效率可能相比下面介绍的要低,但是还是足够 handle 大多数业务场景, Don't Over Thinking! 这种开发模式用 collectstatic 将所有 app和 STATICFILES_DIRS 目录下的静态资源打包到到 STATIC_ROOT 目录。然后可以用 nginx serve 静态资源,比如:

# django settings.py
STATIC_URL = '/static/'

# nginx server config
server {   
    ...
    location /static {    
        autoindex on;    
        alias /opt/aa/webroot/;    
    }
}
复制代码

除了nginx,作者还介绍了一个工具: whitenosie ,文档在这里,有兴趣可以了解一下。

这个阶段的示意图如下所示:

Django 管理静态资源的四个阶段
Django 管理静态资源的四个阶段

总结一下这个阶段:

  • 使用 whitenoise。(我个人还是比较喜欢nginx)
  • 关键配置为: STATICFILES_DIRSSTATIC_ROOT
  • 模板语法不要硬编码!
Django 管理静态资源的四个阶段
  • 每次 deploy别忘了 collectstatic,有一个 --noinput 参数比较有用,这可以实现自动化,而不需要每次 collecstatic 都回答yes or no。

0x02 Cloud Stroage

可以用 S3、Azure、阿里云、七牛云来存储你的静态文件,这样访问速度肯定是要更快的,但是会对开发新增 complexity。django 有个第三方插件:django-storages,但是目前好像还不支持国内的CDN 服务商,比如阿里云、七牛云,当前你完成可以自己写。

比如如果你想使用 Amazon s3存储:

Django 管理静态资源的四个阶段

django 的配置文件:

Django 管理静态资源的四个阶段

其中最关键的配置为: STATICFILES_STORAGE ,它的默认值为 django.contrib.staticfiles.storage.StaticFilesStorage ,也就是文件系统,第一阶段介绍的那个。Django 的官方文档有一个如何使用 cloud 服务、CDN 的 guideline。如果你想自己自己写一个 storage backend,这个文档应该会对你有所帮助。

上图还包含了一个最佳实践:根据 DEBUG 选择不同的aws prefix,这样就不会把测试时的静态资源推到生产 aws bucket。

这时的 collectstatic 会把 STATICFILES_DIRS 的静态资源推到 aws(或其他 cloud provider),而之前的是本地的文件系统。

Django 管理静态资源的四个阶段

你的 stroage engine会为你 handle 正确的 url,比如在模板页面里面使用 static ,能够正确指向实际的 url。

Django 管理静态资源的四个阶段

总结一下这个阶段:

django-storages
STATICFILES_STORAGE
static
collectstaic

0x03 User-Uplaod Media

让用户上传文件到你的服务器是存在很多安全隐患的,所以最好使用第二步提到的 cloud provider。作者提到的是使用 django 的 model form 上传 media,这在某些情况下是做不到的,比如前后端分离的场景。前端使用 cloud provider 的sdk上传至cloud,然后把 url post 给后端或许更加常见。当然如果你使用到了 ImageField 或者 FileField ,有两个参数是你可以利用的: STATICFILES_STORAGEDEFAULT_FILE_STORAGE ,当你设置为 aws 相关配置的时候,它能够自动为你上传到 aws。

Django 管理静态资源的四个阶段

总结一下此阶段:

  • 推荐使用 django-storages
  • 关键配置参数: DEFAULT_FILE_STORAGE
  • 使用 ImageFieldFileField 的时候指定 upload_to

Asset Compilation

也就是前后端分离,前端使用 webpackreact or vue 技术栈。所以你需要:

  • npm
  • webpack
  • webpack-bundle-tracker
  • django-webapck-loader

webpack-bundle-trackerdjango-webapck-loader 能减少你的 headache。简单来说, webpack-bundle-tracker 生成 metadata 数据, django-webapck-loader 利用 metadata 数据使其更好地和 django app 结合。

Django 管理静态资源的四个阶段

webpack 自己是一套完整的体系,你想要很复杂,足够你复杂的,但是简单的使用大致如下:注意最下面的 ./webpack-stats.json 文件,这是 webpackdjango 连接的桥梁。

Django 管理静态资源的四个阶段

重要的配置如下:

Django 管理静态资源的四个阶段

你只需要运行两条指令:

Django 管理静态资源的四个阶段

collectstatic 知道如何通过 webpack-stats.json 找到 bundle 文件,然后把它推送到该去的位置:本地文件系统、aws...

Django 管理静态资源的四个阶段

总结一下此阶段:

  • 推荐使用 webpack-bundle-trackerdjango-webapck-loader
  • 关键配置项: INSTALLED_APPS += "webpack"WEBPACK_LOADER={}webpack.config.js
  • compile、存储静态资源分两步: webpack -> collectstatic
Django 管理静态资源的四个阶段

如果你像我一样真正热爱计算机科学,喜欢研究底层逻辑,欢迎关注我的微信公众号:

Django 管理静态资源的四个阶段

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Linux Command Line

The Linux Command Line

William E. Shotts Jr. / No Starch Press, Incorporated / 2012-1-17 / USD 39.95

You've experienced the shiny, point-and-click surface of your Linux computer-now dive below and explore its depths with the power of the command line. The Linux Command Line takes you from your very ......一起来看看 《The Linux Command Line》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具