Python3 + Django2.0 集成 “七牛云” 对象存储

(SDK文档地址:http://developer.qiniu.com/kodo/api/3928/error-responses

步骤1:

  在七牛云中创建一个 “存储空间”(需要实名认证,每月免费10GB)

步骤2:

  在 “个人面板” --> “秘钥管理” 中得到:ccessKey/SecretKey

步骤3:  

  在django虚拟运行环境中安装 “qiniu” SDK:pip install qiniu

步骤4:使用

  1> 获取七牛云的 token :授权码

# 获取七牛云授权 token
def qiniu_token(request):
# 七牛云授权秘钥(在七牛云中可以得到)
access_key = settings.UEDITOR_QINIU_ACCESS_KEY
secret_key = settings.UEDITOR_QINIU_SECRET_KEY
# 存储对象名称(在七牛云中可以得到)
bucket_name = settings.UEDITOR_QINIU_BUCKET_NAME
# 获得七牛云授权对象 q
q = Auth(access_key,secret_key)
# 获得一个授权的token
token = q.upload_token(bucket_name)
# 将七牛云的授权 token 返回给前端
# return restful.result(data={'token':token})# 这个是我在项目中集成的通用返回方法
return JsonResponse({"data":{"token":"token"}})

  2> js方式上传文件到七牛云:

<!--HTML代码-->
<!-- 引用 qiniu 的js SDK -->
<script src="https://unpkg.com/qiniu-js@2.4.0/dist/qiniu.min.js"></script>
<script scr="自己的js处理文件"></script> 
<body>
  <div>
    <!-- 将 file 按钮放在 label 标签中,并将 file 按钮隐藏,达到想要的效果,因为 file 类型按钮样式是固定的将他放在label中,点击label标签就相当于点击了 file 文件上传按钮-->
    <label class="btn btn-file btn-default"><input type="file" hidden id="upload_news_file">上传图片</label>
  <div>
</body>
/*
* js代码
*/
function News(){}
// 上传文件至七牛云中监控上传 进度 处理方式,来自:observable.subscribe()对象
News.prototype.listenQiniuNext = function (response) {
/*
* observable 中 subscribe 属性:Next(res)
* res 参数是一个带有 total 字段的 object,包含loaded、total、percent三个属性:
* loaded:已上传文件大小,单位:L字节
* total:本次上传的总量控制信息,单位字节,跟文件大小并不一致
* percent:当前上传文件的进度,范围:0 - 100
*
* **** 要先得到字段 total :result.total ****
* */ var total = response.total;
// toFixed(index):保留index为小数
var percent = total.percent.toFixed(0) + "%";
  console.log("文件上传进度:" + percent
); // 上传文件至七牛云中监控上传 出错 处理方式,来自:observable.subscribe()对象
News.prototype.listenQiniuError = function (error) {
/*
* objservable 中 subscribe 的属性:error(err)
* 参数 err 为一个包含 code、message、isRequestError 三个属性的 object 对象:
* code:错误码
* message:错误信息,包含错误吗
* reqld:xhr请求错误的 X-Reqid
* */
console.log("文件上传出现错误,错误信息:" + error.message);
};

// 上传文件至七牛云中监控上传 完成 处理方式,来自:observable.subscribe()对象
News.prototype.listenQiniuComplete = function (response) {
/* 接收上传完成后的后端返回信息,res 参数为一个 object,
* 为上传成功后后端返回的信息,具体返回结构取决于后端sdk的配置,
* 可参考上传策略。
* */
// {hash: "FuAB5QBnVM_CWrw7WGc7jm7LAdyO", key: "1534507254079png"} 默认返回hash与key两个参数
console.log(response);
};

// 将文件上传到七牛云服务器
News.prototype.listenUpload_news_file_qiniu_Event = function () {
var self = this;
var uploadBtn = $('#upload_news_file');
// 定义一个变量保存文件上传的状态
var uploading = false; // change事件:在选择文件后出发
uploadBtn.change(function () {
var file = this.files[0];
// get请求,可以使用ajax get 请求
$.get({
       // 这里是服务端处理的视图函数地址
'url': '/cms/qiniu_token/',
'success': function (result) {
if (result['code'] === 200) {
// 得到服务端返回的 token 验证信息
var token = result['data']['token'];
var houzhui = file.name.split('.');
// 使用当前时间戳作为文件的key
var key = new Date().getTime() + "." + houzhui[houzhui.length - 1]; var config = {
// 是否使用cdn加速
useCdnDomain: true,
// 服务器地址:华东,华南......
region: qiniu.region.z0,
// 如果产生错误,重新上传次数
retryCount: 6
}; var putExtra = {
// 上传文件的名称
fnName: key,
// 文件上传时使用的一些参数
params: {},
// 限制文件上传的类型
mimeType: ["image/png", "image/jepg", "image/gif"]
}; var observable = qiniu.upload(file, key, token, putExtra, config);
/* subscribe对象有三个属性:next,error,complete
* */
observable.subscribe({
/** 如果使用 self.listenQiniuNext() 会报错
** 必须使用 self.listenQiniuNext,因为作为一个参数传递
** 绑定方法后,会改变方法的所属对象,比如绑定后方法不再属于 News,所以无法使用 News 中定义的属性
* **/ // 文件上传进度监控
'next': self.listenQiniuNext,
// 文件上传产生错误时触发
'error': self.listenQiniuError,
// 当文件上传完成时触发
'complete': self.listenQiniuComplete
});
}
}
});
});
}; News.prototype.run = function () {
// 将文件上传到千牛服务器
this.listenUpload_news_file_qiniu_Event();
}; $(function () {
var news = new News();
news.run();
});

 

3> python上传图片到七牛云(在博客 ”django之百度Ueditor富文本编辑器后台集成” 笔记中的文件上传后台处理中有应用):

# 参数:
# upfile: 文件(前端传过来的文件)
# filename: 文件名
  def _upload_to_qiniu(self, upfile, filename):
"""
上传文件到七牛
"""
if not sys.modules.get('qiniu'):
raise RuntimeError('没有导入qiniu模块!')
     # 配置自己的 access_key,secret_key
q = qiniu.Auth(<UEDITOR_QINIU_ACCESS_KEY>, <UEDITOR_QINIU_SECRET_KEY>)
     # 配置自己的: 空间名称
token = q.upload_token(<UEDITOR_QINIU_BUCKET_NAME>)
buffer = BytesIO()
for chunk in upfile.chunks():
buffer.write(chunk)
buffer.seek(0)
ret, info = qiniu.put_data(token, filename, buffer.read())
if info.ok:
       # 配置自己的域名:DOMAIN:http://七牛云的域名/
url = parse.urljoin(UEDITOR_QINIU_DOMAIN, ret['key'])
return 'SUCCESS', url, ret['key'], ret['key']
else:
return 'FAIL', None, None, None

django之集成七牛云对象存储的更多相关文章

  1. DT添加七牛云对象存储插件功能

    七牛云对象存储  1.注意客户购买的空间的存储区域,区域不同对应的上传域名不同    destoon  七牛云上传文件   用下面源码替换include/ftp.class.php   文件代码 &l ...

  2. 使用FileZilla Pro S3协议访问七牛云对象存储

    偶然发现FileZilla还有Pro版本,主要是比免费版多了一些协议支持,也偶然发现七牛云支持了S3协议接口,这样刚好弥补了其没有FTP的不足,于是找官方文档,折腾一下,使用FileZilla Pro ...

  3. Gin + 七牛云对象存储

    配置七牛云存储 创建存储空间 拿到密钥 安装七牛云对象存储SDK 推荐go.mod安装 // 将下面地址复制到go.mod,然后执行go mod download github.com/qiniu/a ...

  4. 基于七牛云对象存储,搭建一个自己专属的极简Web图床应用(手摸手的注释讲解核心部分的实现原理)

    一个极简的Web图床应用,支持复制粘贴与拖拽上传图片 1.开发缘由 日常使用Vs Code编写markdown笔记与博客文章时,在文章中插入图片时发现非常不便 使用本地文件编写相对路径---没法直接复 ...

  5. 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载

    这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...

  6. 七牛云对象存储kodo使用体验

    在这里,我使用了七牛云的对象存储Kodo,和阿里云的OSS,还有腾讯云的COS是同样的产品 oss相关术语 包依赖关系解决 unrecognized import path "golang. ...

  7. CodeIgniter - 集成七牛云存储

    最近有一个项目需要集成七牛云存储的图片存储和调用功能,程序是基于CodeIgniter2.1.3的PHP框架.刚拿到手完全无从下手的感觉,因为像框架这种东西,想从官方的PHPSDK集成进去,需要改动很 ...

  8. 在 Laravel 5 中集成七牛云存储实现云存储功能

    本扩展包基于https://github.com/qiniu/php-sdk开发,是七牛云储存 Laravel 5 Storage版,通过本扩展包可以在Laravel 5中集成七牛云存储功能.   1 ...

  9. 在 Laravel 5 中集成七牛云存储实现云存储功能(非上传)

    本扩展包基于https://github.com/qiniu/php-sdk开发,是七牛云储存 Laravel 5 Storage版,通过本扩展包可以在Laravel 5中集成七牛云存储功能. 1.安 ...

随机推荐

  1. 为什么加密后的数据往往都是base64输出而不是hex16进制输出

    通常加密后的数据都是字节数组,比如流行的aes128对称加密,还有Rsa非对称加密,加密后得到了一个字节数组,这个字节数组存在内存中,往往我们需要输出得到我们人眼能看到的字符. 加密aes(xxx) ...

  2. 一图搞懂Web应用的单点登录

    单点登录即Signle Sign On,简称SSO.其解决的是用户在多个站点之间跳转时需要频繁登录的问题,比如用户登录了天猫,就应该无需再使用账号登录淘宝,它们之间是可以相互信任的,应该自动同步登录状 ...

  3. Oracle对表空间、用户、用户权限的操作

    一.对表空间的操作 1.创建表空间(create tablespace) -- 'hpdb_tablespace' 指定表空间名称 -- 'e:\hpdb.dbf' 指定表空间数据文件名称 -- si ...

  4. 首次分享,大厂资深测试做Api接口自动化测试的关键思路都在这里了

    引言 与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小.因此做接口自动化的性价比更高,通常运用于迭代版本上线前的回归测试中. 手工做接口测试,测试数据和参数都可以由测试人员手动填写和更 ...

  5. 实践剖析.NET Core如何支持Cookie和JWT混合认证、授权

    前言 为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证.授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活!首先我们实现 ...

  6. Google面试评分卡

    Google对工程面试之前,会让面试人员填一张评分卡,以加强面试官对你的理解,大致内容如下: 0 - 对于相关技术领域还不熟悉. 1 - 可以读懂这个领域的基础知识. 2 - 可以实现一些小的改动,清 ...

  7. Docker_使用Rancher管理docker(7)

    一.简介 Rancher是一个开源的企业级全栈化容器部署及管理平台.Rancher为容器提供一揽子基础架构服务:CNI兼容的网络服务.存储服务.主机管理.负载均衡.防护墙--Rancher让上述服务跨 ...

  8. 桥接模式(python)

    from abc import ABCMeta, abstractmethod class Shape(metaclass=ABCMeta): def __init__(self, color): s ...

  9. ':app@debug/compileClasspath': Could not find any version that matches com.android.support:appcompat-v7:30.+.

    ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not find any version th ...

  10. SYCOJ4972的幂次方

    题目- 2的幂次方 (shiyancang.cn) 递归题 #include<bits/stdc++.h> using namespace std; int k; void f(int n ...