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 06 Python
python进阶教程之循环对象
Aug 30 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
Python人脸识别初探
Dec 21 Python
实时获取Python的print输出流方法
Jan 07 Python
利用python如何在前程无忧高效投递简历
May 07 Python
python 设置输出图像的像素大小方法
Jul 04 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
在django admin中添加自定义视图的例子
Jul 26 Python
Python @property装饰器原理解析
Jan 22 Python
pytorch梯度剪裁方式
Feb 04 Python
Python基于数列实现购物车程序过程详解
Jun 09 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
语义化 H1 标签
2008/01/14 Javascript
js表格分页实现代码
2009/09/18 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
21行Python代码实现拼写检查器
2016/01/25 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
迟到检讨书1000字
2014/01/15 职场文书
婚前财产公证书
2014/04/10 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
Go语言编译原理之变量捕获
2022/08/05 Golang