
无需加好友免费技术支持
经过几章的开发,项目的核心功能已经实现,但最头疼的带宽问题仍然没有得到解决。作为一个基层网站,服务器的带宽非常有价值,小水龙头无法忍受大量的高清图片。
不止一种解决方案,如使用CDN加速、负载均衡、对象存储等。
本章将解决服务器带宽不足的问题。
对象存储OSS(Object Storage Service)是一种海量、安全、低成本、高持久的云存储服务,你可以将其作为移动应用、大型网站、图片分享或热点音视频的主要存储方式。一般来说,它类似于云硬盘,其带宽资源充足,数据丢失的可能性几乎为零。而且对于流量小的网站,OSS 费用很少。
作者用自己的博客 OSS ,每月支出约两三毛钱。
基本上所有的云服务提供商都提供它 OSS 阿里云、腾讯云、百度云等服务也有专门的服务 OSS 七牛云,再拍云等等。
利益相关:作者使用的阿里云全家桶(包括后续部署),本章将使用阿里云OSS作为案例解释。新用户通过阿里云OSS推广链接注册有折扣和现金券,更划算。
您也可以根据您的喜好选择其他服务提供商,原则是相似的。
下面从 OSS 从设置开始。
首先打开OSS打开页面。注册阿里云账号后,点击下图中的立即打开:
阿里云 OSS 先用后付费。假如你只是试用,不考虑续租,那就等于零费用。
打开后进入 OSS 管理界面。
阿里云 OSS 用 Bucket 存储具体文件。Bucket 它可以理解为空间或特殊区域。
点击“创建 Bucket”:
来创建页面。
在页面中记录 Bucket名称 和 Endpoint 后续使用的值:
由于相册允许匿名用户访问,读写权限设置为公共读写:
根据图片或喜好选择其他选项。
点击确定后,Bucket 创建。
现在可以了 Bucket 上传文件:
随便上传一些测试图片。
文件管理中显示传输后:
最后一步。
虽然 Bucket 公开阅读的权限,但操作 Bucket 仍需验证用户身份。
所以点击导航栏右上角的头像,然后点击AccessKey管理新管理员 ID 和 Secret。
进入后,页面可能会提醒你尽量用子账户创建安全考虑 ID 和 Secret。按其提示操作即可。
顺利创建好 AccessKey ID 和 AccessKey Secret 之后别忘了打开子账户。 OSS 的权限。
搞定后就可以继续正式写代码了。
阿里云给 Python 程序员提供 OSS 软件开发工具包(SDK),所有常规操作都包装好了,非常方便。
安装在虚拟环境中 SDK:
作者写这篇文章(20211.08.13)此 SDK 仅对 Python 3.8 支持以下版本。 Python 高于 3.8,那么记得查看官方的兼容性更新。
安装成功后,下一步是 views.py 中链接到 Bucket。
在视图文件头部写入:
这里需要填四件事:AccessKey ID 、AccessKey Secret、 Endpoint 和 Bucket 名。
下一步不容易理解。仔细看。
虽然 SDK 提供操作 Bucket 的对象 ObjectIteratorV2 ,但是这个对象提供的功能太少,不能直接用于我们的相册项目。
因此,作为父类,新建一个 ObjIterator 类:
让我们拆解上述代码:
通过阅读源码可以发现,ObjectIteratorV2 存储中文件数据 self.entries 属性中。由于原 ObjectIteratorV2 只有在启动迭代时,才能从云中获取并填充数据 self.entries ,这不符合本项目的使用要求。因此覆写了 __init__(),让它在实例阶段立即获取数据。为了尽量减少旧代码的变化,我们希望这个 OSS 也可以使用类 Django 的分页器。由于分页器要求对象实现计数和取值,因此增加了 __len__() 和 __getitem__() 方法使计数和取值功能和 self.entries 关联起来。原父类中的 _fetch() 该方法用于预处理文件数据。里面的一大段都是从父类源码抄来的,唯一的变化就是 self.entries.sort(...) 这一段。因为父类以文件名排序,为了更符合相册的直觉,修改为上传时间的倒序排序。大功告成,下一步就很轻松愉快了。
你为什么知道要这样写? oss 包和 Django 的源码啊。
我们继续往下走。
新的视图函数 oss_home() ,将旧的 home() 复制函数中的代码,并做出以下改变:
事实上,改变了两行:
第一行,数据集不再来自模型,而是刚刚写的 OSS 类 ObjIterator 。最后一行,模板文件变成了 oss_list.html (这份文件还没写)你看,经过前面的努力,是的 OSS 后续操作 Django 内置模型一样简单,努力工作不是徒劳的。
最后,记得配置这个新视图 url 路由:
接下来写 oss_list.html 模板。
线上环境和开发环境有个很大的不同,就是线上环境具有严重的延迟。因此有些 Bug 只有在网上部署才能发现。
究竟是什么 Bug 卖个关子,先在 base.html 介绍一个新插件 jquery.js 备用:
然后新建
/templates/photo/oss_list.html 模板。
将老的 list.html 复制代码并修改以下代码:
改动如下:
修改了所有图片显示的所有图片 的标签的 src (即路径),变成阿里云 OSS 中文件的路径。记得将 src 修改自己的 OSS 路径。添加到卡片元素中 id="cards" 和 class="... grid-item" 属性,为了解决 Bug 备用。接下来,我们将正式讨论这个问题 Bug 了。因为相册的排版采用了 masonry.js 瀑布流插件,根据页面加载时图片的大小进行排版。但问题是高清图片的大小很大,插件在估计排版时没有加载,导致无法正确知道图片的大小,最终导致图片堆叠在一起的显示错误。
这个问题在开发过程中没有出现,因为图像加载没有延迟。
解决方案是使用 jquery.js 脚本,确保所有图片加载后再次触发 masonry.js 如下:
将这个脚本添加到旧脚本中 list.html 因为它在模板中也有同样的问题。
完成后刷新页面,访问 /photo/oss-home/ 这个地址:
也许你现在还感觉不到。 OSS 存储和本地存储的区别。
别担心,等到下一章部署到网上,你在测试下会有很深的体会。
对象存储 OSS 不仅仅是这篇文章中写的一些东西,它还有很多操作方法。例如,您可以将图片的添加、删除、更改和检查等所有操作集成到您自己的网站中,而不是像现在这样只实现正确性 OSS 列出文件的功能。
另一方面,OSS 它的用途不同于数据库。它有自己的一套优化规则来查询和列出其内部文件。如果您的文件数量巨大,则在本文中实现 ObjIterator 此外,类可能效率低下。 OSS 还有大量的高级功能,如自动生成缩略图url签名、权限管理等。
鉴于教程篇幅有限,对 OSS 如果读者感兴趣,请自己研究。OSS文档。
下一章将讨论 Web 最终内容:部署。
点赞 or 吐槽?评论区见!