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 解析XML文件
Apr 15 Python
详解Python中的正则表达式的用法
Apr 09 Python
详解详解Python中writelines()方法的使用
May 25 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
python traceback捕获并打印异常的方法
Aug 31 Python
Python实现自动访问网页的例子
Feb 21 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
如何用python插入独创性声明
Mar 31 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连接Access数据库的方法小结
2013/06/20 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
php中异常处理方法小结
2015/01/09 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
如何在PHP中读写文件
2020/09/07 PHP
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python3 flask实现文件上传功能
2020/03/20 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
python 代码运行时间获取方式详解
2020/09/18 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
会计专业自荐信范文
2013/12/02 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python