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

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

内容简介:原视频: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 管理静态资源的四个阶段

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

查看所有标签

猜你喜欢:

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

大连接

大连接

[美] 尼古拉斯•克里斯塔基斯(Nicholas A. Christakis)、[美] 詹姆斯•富勒(James H. Fowler) / 简学 / 中国人民大学出版社 / 2013-1 / 59.90元

[内容简介] 1. 本书是继《六度分隔》之后,社会科学领域最重要的作品。作者发现:相距三度之内是强连接,强连接可以引发行为;相聚超过三度是弱连接,弱连接只能传递信息。 2. 本书讲述了社会网络是如何形成的以及对人类现实行为的影响,如对人类的情绪、亲密关系、健康、经济的运行和政治的影响等,并特别指出,三度影响力(即朋友的朋友的朋友也能影响到你)是社会化网络的强连接原则,决定着社会化网络的......一起来看看 《大连接》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具