Django Admin 上传文件到七牛云的示例代码


Posted in Python onJune 20, 2020

中文圈关于Django Admin 上传文件到七牛云的资料和函数库已经是2年前的了,国外的则都是关于AWS S3、Azure Storage一些国外的服务的。我根据Django的文档里提到的存储系统来实现上传文件到七牛云的简单功能。

在Django Admin的表单是根据数据模型生成的,其中文件上传由FileField和继承FileField的ImageField来决定的,文件上传到静态文件目录,数据库保存相对路径。实现上传文件到七牛云我们是根据FileField的storage参数来实现的。

models.ImageField(storage=MyStorage())

storage参数需要传入一个实现抽象类Storage的对象。

下面引用文档的原句

你自定义的存储系统必须为Django.core.files.storage.Storage的一个子类:

from django.conf import settings
from django.core.files.storage import Storage

class MyStorage(Storage):
  def __init__(self, option=None):
    if not option:
      option = settings.CUSTOM_STORAGE_OPTIONS
    ...

然后重写全部的抽象方法,具体的可以去官网文档看。我们这里先不继承Storage。我在Django的核心里找到了已经继承了的FileSystemStorage,我想只要继承Django标准的文件管理类

FileSystemStorage,重载_save部分变成上传到七牛云不就好了。说干就干。

class MyStorage(FileSystemStorage):
  def _save(self, name, content):
    # 延续原方法的写法
    filename = name.replace('\\', '/')
    # 将文件传入封装好的对象里
    q = Qiniu()
    q.upload_stream(filename, content.file.getvalue())
    return filename

我简单写一下封装的Qiniu上传的类

class Qiniu():
  def __init__(self):
    self.access_key = settings.QINIU_ACCESS_KEY
    self.secret_key = settings.QINIU_SECRET_KEY
    # 要上传的空间
    self.bucket_name = settings.QINIU_BUCKET_NAME
    # 构建鉴权对象
    self.auth = Auth(self.access_key, self.secret_key)
    
  def get_token(self, key):
    """

    :param key: 文件名
    :return: 上传令牌
    """
    policy = {
      'scope': settings.QINIU_BUCKET_NAME,
      'mimeLimit': 'image/jpeg;image/png',
      'deadline': 3600
    }
    # 3600为token过期时间,秒为单位。3600等于一小时
    token = self.auth.upload_token(self.bucket_name, key, 3600, policy)
    return token
    
  def upload_stream(self, filename, stream_data):
    """

    :param filename: 文件名
    :param stream_data: 二进制数据
    :return: 无
    """
    # 上传后保存的文件名
    key = filename
    # 生成上传 Token,可以指定过期时间等
    token = self.auth.upload_token(self.bucket_name, key, 3600)
    # 要上传文件的本地路径
    # localfile = file_path
    ret, info = put_data(up_token=token, key=key, data=stream_data)
    assert ret['key'] == key
    # assert ret['hash'] == etag_stream(stream_data)

参考资料:

https://docs.djangoproject.co ...

总结

到此这篇关于Django Admin 上传文件到七牛云的文章就介绍到这了,更多相关Django Admin 上传文件到七牛云内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
推荐11个实用Python库
Jan 23 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
基于python实现查询ip地址来源
Jun 02 Python
python判断是空的实例分享
Jul 06 Python
pycharm debug 断点调试心得分享
Apr 16 Python
一劳永逸彻底解决pip install慢的办法
May 24 Python
什么是python的函数体
Jun 19 #Python
浅谈Python中的生成器和迭代器
Jun 19 #Python
python中有帮助函数吗
Jun 19 #Python
python中导入 train_test_split提示错误的解决
Jun 19 #Python
python中get和post有什么区别
Jun 19 #Python
python中setuptools的作用是什么
Jun 19 #Python
python怎么判断模块安装完成
Jun 19 #Python
You might like
apache配置虚拟主机的方法详解
2013/06/17 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
JQuery伸缩导航练习示例
2013/11/13 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
Vue.js实现分页查询功能
2020/11/15 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
django model通过字典更新数据实例
2020/04/01 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
大学生毕业自荐信
2013/10/10 职场文书
美术师范毕业生自荐信
2013/11/16 职场文书
交通事故检查书范文
2014/01/30 职场文书
教师开学感言
2014/02/14 职场文书
早读课迟到检讨书
2014/09/25 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB