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类继承用法实例分析
Oct 10 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
Python制作数据导入导出工具
Jul 31 Python
用Eclipse写python程序
Feb 10 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
python 类之间的参数传递方式
Dec 20 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
python实现引用其他路径包里面的模块
Mar 09 Python
Python多线程正确用法实例解析
May 30 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 购物车的例子
2009/05/04 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
node内置调试方法总结
2018/02/22 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
python实现二叉查找树实例代码
2018/02/08 Python
python实现Zabbix-API监控
2018/09/17 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
浅析python 字典嵌套
2020/09/29 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
会话Bean的种类
2013/11/07 面试题
咖啡蛋糕店创业计划书
2014/01/28 职场文书
环保建议书200字
2014/05/14 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
简爱电影观后感
2015/06/10 职场文书
新生儿未入户证明
2015/06/23 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
python 中的jieba分词库
2021/11/23 Python
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库
Vue router配置与使用分析讲解
2022/12/24 Vue.js