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的加密模块md5、sha、crypt使用实例
Sep 28 Python
Python 对象中的数据类型
May 13 Python
python实现简单遗传算法
Mar 19 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
Python flask路由间传递变量实例详解
Jun 03 Python
Python reques接口测试框架实现代码
Jul 28 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
pycharm代码删除恢复的方法
Jun 26 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读取MySQL数据代码
2008/06/05 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
python写xml文件的操作实例
2014/10/05 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python实现串口通信的示例代码
2020/02/10 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
.net面试题
2016/09/17 面试题
生产经理的自我评价分享
2013/11/07 职场文书
数控技术应届生求职信
2013/11/13 职场文书
师范应届毕业生自荐信
2013/11/18 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
老兵退伍标语
2014/10/07 职场文书
学生检讨书怎么写
2014/10/09 职场文书
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB