注:本篇文章参考文献 乾坤大挪移,如何将同步阻塞(sync)三方库包转换为异步非阻塞(async)模式?Python3.10实现。-刘悦。

首先需要拥有一个七牛云的账号

七牛云官网:七牛云 | 一站式场景化智能视频云 (qiniu.com)

登录成功后前往密钥管理,复制保存自己的 AccessKey和SecretKey。

其次需要创建一个属于自己的空间

存储区域尽量选择与自己较近的区域

创建成功后会提示你是否绑定域名,如果不绑定会给你一个测试域名只有30天并且每天流量限额10GB。

至此我们的七牛云存储空间就创建完成了

以上步骤完成后就可以编写Python代码了。

官方Pythonsdk源码地址:GitHub - qiniu/python-sdk: Qiniu Resource (Cloud) Storage SDK for Python

在官方的Python-SDK里,只有同步编程没有异步编程,我们可以查看同步的源代码稍稍修改一下,修改成异步编程。

那到底什么是异步编程呢?

允许同一时间发生(处理)多个事件。程序调用一个耗时较长的功能(方法)时,它并不会阻塞程序的执行流程,程序会继续往下执行。当功能执行完毕时,程序能够获得执行完毕的消息或能够访问到执行的结果。

Python如何异步编程?

async/await:两个用于定义协程的关键字。

asyncio:为Pythonm中协程运行和管理提供基础和API库

asyncio 模块最大的特点就是,只存在一个线程。

由于只有一个线程,就不可能多个任务同时运行。asyncio是“多任务合作”模式(cooperative multitasking),允许异步任务交出执行权给其他任务,等到其他任务完成,再收回执行权仅需往下执行。由于代码的执行权在多个任务之间交换,所以看上去好像多个任务同时运行,其实底层只有一个线程,多个任务分享运行时间。

asyncio 模块在单线程上启动一个事件循环(event loop),时刻监听新进入循环的事件,加以处理,并不断重复这个过程,直到异步任务结束。

修改方向

首先下载第三方模块qiniu

pip install qiniu

其次先导入官方的SDK查看是如何上传文件的

#这是官方提供的方法
from qiniu import Auth, put_file, etag
import qiniu.config
#需要填写你的 Access Key 和 Secret Key
access_key = 'Access_Key'
secret_key = 'Secret_Key'
#构建鉴权对象
q = Auth(access_key, secret_key)
#要上传的空间
bucket_name = 'Bucket_Name'
#上传后保存的文件名
key = 'my-python-logo.png'
#生成上传 Token,可以指定过期时间等
token = q.upload_token(bucket_name, key, 3600)
#要上传文件的本地路径
localfile = './sync/bbb.jpg'
ret, info = put_file(token, key, localfile, version='v2')
print(info)
assert ret['key'] == key
assert ret['hash'] == etag(localfile)

可以看到主要修改的方法有

  1. 实例化鉴权对象
  2. 生成上传七牛云的Token
  3. 获取并上传本地文件

我们把这些涉及到IO操作的方法全部换成异步执行即可。

具体代码

# -*- coding: utf-8 -*-
import asyncio
# 开启异步循环事件
import httpx
# 允许异步发送请求
import aiofiles
# 允许异步读取文件
import hmac
# python里不可逆的加密模块 使用msg进行加密
import json
# 用户转换JSON数据
import time
# 时间戳
from hashlib import sha1
# 加密方式
from base64 import urlsafe_b64encode
# 对类字节对象s进行安全的URL及文件系统Base64编码,替换标准Base64编码中的'+'为'-', '/'为'_',返回编码后的字节序列# 异步七牛云类
class Qiniu(object):def __init__(self , access_key , secret_key):self.__access_key = access_keyself.__secret_key = secret_key.encode('utf-8')async def __token(self , data):hashed = hmac.new(self.__secret_key , data.encode('utf-8') , sha1)ret = urlsafe_b64encode(hashed.digest())return ret.decode('utf-8')async def token(self , data):return '{0}:{1}'.format(self.__access_key , await self.__token(data))async def token_with_data(self , data):ret = urlsafe_b64encode(data.encode('utf-8'))data = ret.decode('utf-8')return '{0}:{1}:{2}'.format(self.__access_key , await  self.__token(data) , data)async def __upload_token(self , policy):data = json.dumps(policy , separators=(',' , ':'))return await self.token_with_data(data)async def upload_token(self , bucket , key=None , expires=3600 , policy=None , strict_policy=True):"""生成上传凭证Args:bucket:  上传的空间名key:     上传的文件名,默认为空expires: 上传凭证的过期时间,默认为3600spolicy:  上传策略,默认为空Returns:上传凭证"""if bucket is None or bucket == '':raise ValueError('invalid bucket name')scope = bucketif key is not None:scope = '{0}:{1}'.format(bucket , key)args = dict(scope=scope ,deadline=int(time.time()) + expires ,)return await self.__upload_token(args)async def put_file(self , up_token , key , district_url , file_path , mime_type='application/octet-stream' ,params=None , file_name=None):"""上传文件到七牛Args:up_token:                 上传凭证key:                      上传文件名district                  存储区域路径file_path:                上传文件的路径params:                   自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvarmime_type:                上传数据的mimeTypefile_name:                文件本地名称Returns:一个ResponseInfo对象"""# 发送请求需要携带的变量fields = {}# 判断是否传参自定义变量if params:for k , v in params.items():fields[k] = str(v)# 文件名如果不为空则加入请求变量里if key is not None:fields['key'] = key# 将鉴权token加入请求变量fields['token'] = up_token# file_name 是该文件在本地的文件名f_name = file_nameif not f_name or not f_name.strip():f_name = 'file_name'# 以二进制形式打开文件async with aiofiles.open(file_path , 'rb') as f:content = await f.read()# 使用with关键字调用httpx的异步发送请求方法async with  httpx.AsyncClient() as client:try:# 发送请求到具体存储区域上传地址,携带参数以及文件。files={文件在请求里的名字,并不是保存到空间时的名字;具体文件;文件类型(二进制数据类型)}r = await client.post(district_url , data=fields , files={'file': (f_name , content , mime_type)})return rexcept Exception as e:print(e)return '上传失败!'if __name__ == '__main__':q = Qiniu('输入你的access_key' , '输入你的secret_key')# 生成上传token凭证token = asyncio.run(q.upload_token(bucket='请输入空间名称' , key='请输入文件名称'))# 上传文件# 存储区域的上传地址,详情:https://developer.qiniu.com/kodo/1671/region-endpoint-fq'# 注意! 存储区域的上传地址里请吧s去掉,否则会上传失败  例:http(s)://upload.qiniup.com => http://upload.qiniup.com。r = asyncio.run(q.put_file(up_token=token ,key='请输入文件名称' ,district_url='请输入空间存储区域的上传路径' ,file_path='文件的本地路径'))print(r)

再次封上该项目地址,供大家使用。

GitHub地址:https://github.com/renaissancezyc/async_qiniu

Gitee地址: async_qiniu: Python联调七牛云,并异步上传文件

Python联调七牛云异步上传文件相关推荐

  1. java获取ajax上传的文件,Java使用Ajax异步上传文件

    相关代码示例: html代码片段: 名称 class="layui-input"> 描述 文件 请选择配置文件 立即提交 重置 js代码片段: //上传配置文件 $(&quo ...

  2. 七牛云 图片上传覆盖

    php使用七牛云上传图片,覆盖云上已有文件: 使用七牛云存储提供的PHP SDK,可以非常方便的将本地文件上传到七牛,但默认情况下,上传的文件不会覆盖旧文件,也就是说,之前上传了一个名为photo.j ...

  3. 修改form重定到iframe中,模拟异步上传文件的效果

    2019独角兽企业重金招聘Python工程师标准>>> <%@ page contentType="text/html; charset=GBK" lang ...

  4. jQuery异步上传文件

    jQuery异步上传文件 我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="fil ...

  5. 解决python发送multipart/form-data请求上传文件的问题

    解决python发送multipart/form-data请求上传文件的问题 参考文章: (1)解决python发送multipart/form-data请求上传文件的问题 (2)https://ww ...

  6. input[type=file] 异步上传文件

    背景 UI如图所示,其中有一个拍照图标,点击后要选择拍照或者从相册中选择要上传的图片. 拍照上传部分的代码如下 html部分 <div class="take-photo"& ...

  7. jq ajax异步上传图片插件,jQuery异步上传文件插件ajaxFileUpload详细介绍

    一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...

  8. Node.js——异步上传文件

    前台代码 submit() {var file = this.$refs.fileUpload.files[0];var formData = new FormData();formData.appe ...

  9. jq ajax异步上传文件,jQuery插件ajaxFileUpload异步上传文件

    AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能,选择它因为它的配置 ...

最新文章

  1. CentOS 6.5 下配置Java环境
  2. python 操作.mat文件
  3. 洛谷P1939 【模板】矩阵加速(数列)
  4. 每次新建Android项目都报样式找不到的错误?
  5. gcc参数 -i, -L, -l, -include
  6. mysql语句怎么记_Mysql常用语句(记一下,免得忘)
  7. MongoDB数据表基本操作
  8. js+jquery手写弹出提示框
  9. 第七章—JavaScript数组
  10. mysql批量更新报错_Mysql批量更新的三种方式
  11. 【李宏毅2020 ML/DL】P15 Why Deep-
  12. Mac上创建cocos2d-x工程
  13. 泰山OFFICE在LINUX上输入法候选框位置错误的两个解决思路
  14. 容器技术Docker K8s 4 容器编排技术基础-Kubernetes
  15. 360黑客攻防技术分享会
  16. 企业高薪招人,近5成岗位月薪过万
  17. 基于深度学习的色情视频鉴定
  18. 图像修复 python_50.图像修复
  19. PTA 最大和最小 (10 分)请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差。
  20. Spring Boot CORS跨域资源共享实现方案

热门文章

  1. NestedScrollView
  2. win10有源信号分辨率怎么调_实例分析丨信号链中放大器噪声对总噪声有多少贡献?...
  3. Python线性规划库Pulp的详解及应用示例
  4. 西门子200恒压供水梯形图_S7200一拖二恒压供水系统?
  5. tensorflow.python.framework.errors_impl.CancelledError: [_Derived_]RecvAsync is cancelled.
  6. H.265(HEVC)解码片源测试序列,解码器下载
  7. # 关于给小程序字体加粗
  8. Aircrack-ng破解无线网络
  9. Eclipse3.4.0的安装及用来进行C++编程
  10. java计算机毕业设计至臻阁古董拍卖网源码+数据库+系统+lw文档+mybatis+运行部署