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类的动态修改的实例方法
Mar 24 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
用python介绍4种常用的单链表翻转的方法小结
Feb 24 Python
Python文件读写w+和r+区别解析
Mar 26 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
python如何提升爬虫效率
Sep 27 Python
Python数据分析入门之教你怎么搭建环境
May 13 Python
Pytest中skip skipif跳过用例详解
Jun 30 Python
Python 中 Shutil 模块详情
Nov 11 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基础学习之变量的使用
2011/06/09 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
Yii框架批量插入数据扩展类的简单实现方法
2017/05/23 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
xmlplus组件设计系列之图标(ICON)(1)
2017/05/05 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python使用zip将list转为json的方法
2018/12/31 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
材料化学应届生求职信
2013/10/09 职场文书
小区门卫管理制度
2014/01/29 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
综合素质自我评价评语
2015/03/06 职场文书
放假通知范文
2015/04/14 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
中秋节晚会开场白
2015/05/29 职场文书
HTML中的表单元素介绍
2022/02/28 HTML / CSS