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抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python返回昨天日期的方法
May 13 Python
在Django的上下文中设置变量的方法
Jul 20 Python
python创建文件备份的脚本
Sep 11 Python
详解如何用django实现redirect的几种方法总结
Nov 22 Python
python3.4爬虫demo
Jan 22 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python实现小世界网络生成
Nov 21 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
python dir函数快速掌握用法技巧
Dec 09 Python
python中PyQuery库用法分享
Jan 15 Python
总结Python连接CS2000的详细步骤
Jun 23 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图片添加文字水印实现代码
2016/03/15 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
js树形控件脚本代码
2008/07/24 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
不要用强制方法杀掉python线程
2017/02/26 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
python批量创建指定名称的文件夹
2019/03/21 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
领导干部培训感言
2014/01/23 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Python多个MP4合成视频的实现方法
2021/07/16 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
python处理json数据文件
2022/04/11 Python