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让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
Python生成随机密码的方法
Jun 16 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
高效使用Python字典的清单
Apr 04 Python
通过python爬虫赚钱的方法
Jan 29 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
Python建造者模式案例运行原理解析
Jun 29 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
Python实现获取操作系统版本信息方法
2015/04/08 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
Django中ORM的基本使用教程
2020/12/22 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
如何提高JDBC的性能
2013/04/30 面试题
什么是Web Service?
2012/07/25 面试题
分公司经理岗位职责
2013/11/11 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
授权委托书
2014/09/17 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
总经理助理岗位职责
2015/01/31 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS