django-ckeditor上传图片到又拍云实现云存储

2022年11月14日 22:22 ry 43

由于我的服务器是轻量级的,考虑到后面博客图片太多,容易造成访问延迟,因此准备把博客图片传到第三方云平台实现存储并加速,以此来减少我服务器的压力,国内的知名云存储无非七牛云和又拍云,对于https网站来说,又拍云无疑更加优惠,对新人很便宜友好,话不多说,开始注册。注册后在通过身份认证即可开始配置创建云存储服务后,点击配置,如图所示注意哈,我网站的域名是codingchangeworld.com,这里千万不要直接用你的顶级域名绑定,否则你的顶级域名会被云存储这个服务占用,导致你用顶级域名无法访问你的网站!,因此我打算创建个二级域名,我服务器是腾讯云的,可以直接创建二级域名,如图所示

申请了后开始绑定img这个二级域名,再按照如下图操作,将CNAME复制并添加你刚申请的img域名记录值中如图所示

配置号了,接下来弄django-ckeditor了,一般django-ckeditor默认上传的路径是通过medie_url路径确定的,现在我们要自定义上传路径,官方提供了我们自定义的方法DEFAULT_FILE_STORAGE值,我们在settings.py中加入

DEFAULT_FILE_STORAGE = 'users.ckeditor_upyun.StorageObject'

注意,users是一个app,ckeditor_upyun是app下的ckeditor_upyun.py文件,StorageObject是py文件下的类,我们看下这个代码,如图所示具体代码如下所示

import datetime
import uuid
import upyun
from django.core.files.storage import Storage
from django.conf import settings
class StorageObject(Storage):
    def __init__(self):
        self.now = datetime.datetime.now()
        self.file = None

    def _new_name(self, name):
        #判断是否来自用户头像文件,是的话传入又拍云Users文件夹
        if 'Users' in name:

            new_name = "Users/{}.{}".format(str(uuid.uuid1()).replace('-', ''),
                                              name.replace('Users','').split(".").pop())
        #否则1话传入blogImg文件夹
        else:
            new_name = "blogImg/{}.{}".format( str(uuid.uuid1()).replace('-', ''),
                               name.split(".").pop())

        return new_name

    def _open(self, name, mode):
        return self.file

    def _save(self, name, content):
        """
        上传文件到又拍云
        """
        print('content:',content)
        print(type(content))

        file_name = self._new_name(name)
        print(file_name)

        up = upyun.UpYun('服务名称', '操作员账号', '操作员密码', timeout=30,
                         endpoint=upyun.ED_AUTO)


        up.put(file_name, content.file, checksum=True)
        base_url = '{}{}'.format(settings.UPYUN_URL,file_name)
        print(base_url)
        return base_url


    def exists(self, name):
        # 验证文件是否存在,因为会去生成一个新的名字存储到七牛,所以没有必要验证
        return False

    def url(self, name):
        # 上传完之后,已经返回的是全路径了
        return name

这里只要看_new_name方法和_save方法,其他的方法我们不用动。_new_name方法中的name参数即是我们django-ckeditor文件上传时的文件名,在这个方法中我们重新命名了改文件-防止上传到又拍云文件名重复,这里我为什么用if else判断呢,主要是我又拍云创建了2个文件夹,一个专门存用户头像的,一个专门存博客图片的,用户头像上传的我是用的imgField接收的,上传的视图代码如下所示

因此_new_name中直接可以判断文件是用户头像还是博客文章的,如果你们想放在一起的话就不用这样麻烦判断了,直接放一起。_save函数中content就是上传的文件内容(图片内容),这个方法就是又拍云上传的主要实现过程,又拍云上传有api文档,可以很好的查看其上传方法,我们首先要pip install upyun 命令下载库,直接用up.put直接上传,这是我又拍云云存储的文件夹

基本这就全部完成了!

欢迎发表评论~

点击此处登录后即可评论


评论列表
2022年11月15日 15:31 ry:
@dikelan这个后面好像要收费吧

2022年11月15日 09:47 dikelan:
大佬,如何利用jsdelivr创建免费的CDN。

2022年11月15日 08:45 201:

大佬带带我


2022年11月14日 22:26 ry:

cool又拍云yyds



赣ICP备2021001574号-1

赣公网安备 36092402000079号