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 相关文章推荐
在漏洞利用Python代码真的很爽
Aug 26 Python
python pickle 和 shelve模块的用法
Sep 16 Python
详解python时间模块中的datetime模块
Jan 13 Python
CentOS安装pillow报错的解决方法
Jan 27 Python
Python处理文本换行符实例代码
Feb 03 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Python3中的bytes和str类型详解
May 02 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
tensorflow 模型权重导出实例
Jan 24 Python
python3中TQDM库安装及使用详解
Nov 18 Python
python删除csv文件的行列
Apr 06 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 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
使用PHP的日期与时间函数技巧
2008/04/24 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
信号生成及DFT的python实现方式
2020/02/25 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
法国春天百货官网:Printemps.com
2020/06/29 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
企业后勤岗位职责
2014/02/28 职场文书
工商干部先进事迹
2014/05/14 职场文书
志愿者宣传口号
2014/06/17 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis