Django实现静态文件缓存到云服务的操作方法

 更新时间:2021年8月18日 00:00  点击:1781

一般与页面有关的系统都会有大量的静态文件,包括js、css以及图标图片等,这些文件一般是项目的相对路径,在加载的时候会从本地读取再转发出去。由于这类文件一般比较大,导致接口响应变长,但是这些文件一般很少改动,所以非常适合通过Nginx或者云服务来缓存。一般云服务与cdn无缝集成,能够更快下发到客户端。我们后台系统很多使用的是基于python的Django框架,该怎么来实现静态文件缓存呢?

这个过程简单的让人惊讶,但是开始一直搞不清楚关系,前前后后耽误了不少时间。

1.collectstatic命令

首先 Django有一个collectstatic的命令,该脚本的功能是将本地的静态文件以及需要的依赖,例如Django和python自己需要的静态文件等打包到一个统一的目录下。这有点类似于maven发布前的打包功能。

这个脚本一般在上线的时候会执行。例如我们的启动脚本里这么写的:

sh collectstatic.sh

然后在djang的配置文件里加这么一行:

static-map = /static=./static_files

我们将本地的静态文件打包发送到云服务就是用collectstatic来实现的。

2.如何发布到云服务

方法非常简单,代码也非常少,但是貌似很多地方都没说清楚为什么,害的我搞了好久,白了很多垃圾代码。

首先你要新建一个继承了Storage的类,例如这样子:

@deconstructible
class CosStorage(Storage):

上面的注解也必须要有的。

然后在很多材料里会将,要在这里类里实现多个方法,有的是以_开头,有的就是普通的类,我理解_开头的主要是collectstatic执行的方法,而不带的是程序执行的时候调用的。前者类似java中的各类service,程序启动的时候就会执行。而后者类似controller下的接口,只有外部调用的时候才会执行。

以_开头的方法最重要的是下面这三个:

def __init__(self):
        logging.info('init cos file list...')
        self.get_cos_file_list()
 
    # 看看这里是否需要
    def _open(self, name, mode='r'):
        return File(open(self.path(name), mode))
 
    def _save(self, name, content):       
        cms.util.upload_os_file(FileBizType.TRUMAN_CMS_STATIC_FILES, content, name, name)         
            time.sleep(0.02)

__init__自然是为了初始化而设置的。根据需要写对应的代码,例如调用云服务需要的签名等等

_open()这个我当时忘了测试一下有没有用了,按道理这里是打开文件的,反正我是上么这么写的。

_save(self, name, content)是最关键的代码。这个接口是理解Storage的两大钥匙。这个方法的功能是处理当前已经打开的文件,文件标题就是name,content就是将文件内容转换成的字节流,你直接用就行。这个该怎么理解呢?

name的含义:假如你的静态路径很深,文件很多,类型也很杂。那么Storage首先就帮你处理路径的问题了,name就是相对路径+文件名。所以你传的时候使用name就将相对目录一起传过去了。

content的含义:content就是文件的内容,不管是js、css、还是图标图片,在网络传的时候都会先转换成字节流是不是。这里的content就是当前文件的字节流。所以就使用upload_os_file(content) 就将文件内容发出去了,不需要自己再读文件 ,转换成字节流等操作。不过这里的upload_os_file是我自己的业务代码,你可以根据需要做对应的实现。

另外一个重要的问题是_save一次只处理一个文件,所以你写这个方法里的代码的时候只要考了一个文件就行了,不用多此一举写批量等逻辑。

这里还有一点就是如果不加限制,_save的执行速度会非常快 ,一下就将所有文件全部读到,并且一个文件一个请求全部发出去,这可能导致服务端来不及处理而被拒绝等情况。方法也很简单,_save里加个等待就行了

time.sleep(0.02)

上面的代码在服务启动过程中执行到collectstatic时会自动扫描,自动加载,自动执行,但是你要在自己的配置文件中添加如下信息,否则会找不到。

STATICFILES_STORAGE = 'cos.cos_storage.CosStorage'

3.访问时是如何重定向到cos的

将文件存到云服务之后,页面执行的时候怎么访问呢?

这就涉及到Storage的其他几个方法了,主要是:

def listdir(self, path):
        pass
 
    def delete(self, name):
        pass
 
    def size(self, name):
        pass
 
    def url(self, name):
      url = cms.util.get_file_os_download_url(name)
        return url
 
    def exists(self, name):
        pass

  上面看名字我们就能大致知道功能,最重要的是url()方法,这个是理解Storage的第二把钥匙。

这里的name就是文件在云服务中的相对路径,你需要将拼接一下你的域名等就是文件的地址了。然后返回就行了。

如果静态文件都是公开的,这里的url貌似不写也行,能够自动实现将域名和文件相对路径拼接程完整的访问url。

但是在我们的系统中,静态文件是不允许直接访问,需要带签名的。 所以我们这里需要在url里通过自定义的get_file_os_download_url()方法去访问我们另外一个服务。

但是这里有一个坑,就是python的基础包中也会用相对路径访问自己的静态文件,也就是这么写"/title.png"等,这种情况无法被url拦截到。因为我们业务的代码里是统一加前缀/static/的。

该怎么拦截,至今没有解决,如果你知道,请和我说,谢谢!

到此这篇关于Django实现静态文件缓存到云服务的操作方法的文章就介绍到这了,更多相关Django静态文件缓存内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • IDEA中的clean,清除项目缓存图文教程

    这篇文章主要介绍了IDEA中的clean,清除项目缓存图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
  • Django def clean()函数对表单中的数据进行验证操作

    这篇文章主要介绍了Django def clean()函数对表单中的数据进行验证操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-09
  • iOS蓝牙设备名称缓存问题的解决方法

    这篇文章主要给大家介绍了关于iOS蓝牙设备名称缓存问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • AngularJS实现Model缓存的方式

    这篇文章主要介绍了AngularJS实现Model缓存的方式,分享了多种AngularJS实现Model缓存的方法,感兴趣的小伙伴们可以参考一下...2016-02-05
  • Nodejs下DNS缓存问题浅析

    本文给大家一起探讨nodejs下dns的缓存问题,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧...2016-11-22
  • @CacheEvict + redis实现批量删除缓存

    这篇文章主要介绍了@CacheEvict + redis实现批量删除缓存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-12
  • python怎么删除缓存文件

    在本篇文章里小编给大家整理的是一篇关于python删除缓存文件方法,需要的朋友们可以学习下。...2020-07-19
  • IIS7、iis7.5中禁止缓存单个静态文件的配置方法

    这篇文章主要介绍了IIS7、iis7.5中禁止缓存单个静态文件的配置方法,需要的朋友可以参考下...2017-07-06
  • vue项目中禁用浏览器缓存配置案例

    这篇文章主要介绍了vue项目中禁用浏览器缓存配置案例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-09-12
  • 在Django中使用MQTT的方法

    这篇文章主要介绍了在Django中使用MQTT的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-10
  • 强制页面不缓存的方法

    页面不缓存可以让我们有更新就立即更新出来用户不需要清除浏览器缓存或不停的按f5刷新了,这里整理了解一些关于页面不缓存的方法,具体的如下。 一,js,css,图片文件不...2016-09-20
  • 安卓手机如何清理缓存

    小编给大家带来一篇关于安卓手机缓存怎么清理的问题解答,有需要的可以参考一下   安卓手机怎么清理缓存 android清除程序缓存的方法  一,...2017-07-06
  • SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

    这篇文章主要介绍了SpringCache 分布式缓存的实现方法(规避redis解锁的问题),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-20
  • 解决导入django_filters不成功问题No module named 'django_filter'

    这篇文章主要介绍了解决导入django_filters不成功问题No module named 'django_filter',具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-15
  • C++开发在IOS环境下运行的LRUCache缓存功能

    本文着重介绍如何在XCODE中,通过C++开发在IOS环境下运行的缓存功能。算法基于LRU,最近最少使用,需要的朋友可以参考下...2020-04-25
  • 详解如何使用Docker部署Django+MySQL8开发环境

    这篇文章主要介绍了详解如何使用Docker部署Django+MySQL8开发环境,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-19
  • PHP缓存集成库phpFastCache学习教程

    PHP缓存的方法有很多种,常用的有memcache, memcached。现在我们来学习一个php缓存集成库phpFastCache,就是开源的,只有一个简单的php文件,就可以支持包括apc, memcache, m...2016-11-25
  • 详解AngularJS中$http缓存以及处理多个$http请求的方法

    $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据,通过本文给大家介绍AngularJS中$http缓存以及处理多个$http请求的方法,希望的朋友一起学习吧...2016-02-12
  • Django 解决由save方法引发的错误

    这篇文章主要介绍了Django 解决由save方法引发的错误,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-21