又拍云存储 Python SDK,基于 又拍云存储 HTTP REST API 接口 开发。
- 不再兼容 1.x 的版本,新版接口设计和实现更加 Pythonic ,且代码风格完全符合 pep8 规范。
- 2.2.0 及以上版本同时兼容了最新版本的 Python 2.6 / 2.7 / 3.3 / 3.4。
可选依赖 requests: HTTP for Humans,推荐!
pip install upyun
运行测试用例
export UPYUN_BUCKET=<bucket>
export UPYUN_USERNAME=<username>
export UPYUN_PASSWORD=<password>
make init test
特别地,若为图片空间还需在运行前指定如下环境变量:
export UPYUN_BUCKET_TYPE=P
import upyun
up = upyun.UpYun('bucket', 'username', 'password', timeout=30, endpoint=upyun.ED_AUTO)其中,参数 bucket 为空间名称,username 和 password 分别为授权操作员帐号和密码,必选。
参数 timeout 为 HTTP 请求超时时间,默认 60 秒,可选。
以及,根据国内的网络情况,又拍云存储 API 目前提供了电信、联通网通、移动铁通三个接入点,在初始化时可由参数 endpoint 进行设置,其可选的值有:
upyun.ED_AUTO # 根据网络条件自动选择接入点,默认
upyun.ED_TELECOM # 电信接入点
upyun.ED_CNC # 联通网通接入点
upyun.ED_CTT # 移动铁通接入点默认设置为 upyun.ED_AUTO , 但是我们推荐根据服务器网络状况,手动设置合理的接入点以获取最佳的访问速度。同时,也可通过:
up.endpoint = upyun.ED_TELECOM在对象使用过程中更改。
up.put('/upyun-python-sdk/ascii.txt', 'abcdefghijklmnopqrstuvwxyz\n')其中,方法 up.put 默认已开启相应目录的自动创建。
headers = { 'x-gmkerl-rotate': '180' }
with open('unix.png', 'rb') as f:
res = up.put('/upyun-python-sdk/xinu.png', f, checksum=True, headers=headers)其中,参数 checksum 和 headers 可选,前者默认 False,表示不进行 MD5 校验; 后者可根据需求设置自定义 HTTP Header,例如作图参数 x-gmkerl-*, 具体请参考 标准 API 上传文件 。
上传成功,如果当前空间是图片空间,那么 res 返回的是一个包含图片长、宽、帧数和类型信息的 Python Dict 对象 (文件空间,返回一个空的 Dict):
{'frames': '1', 'width': '1280', 'file-type': 'PNG', 'height': '800'}
上传失败,则抛出相应异常。
res = up.get('/upyun-python-sdk/ascii.txt')下载成功,返回文件内容; 失败则抛出相应异常。
with open('xinu.png', 'wb') as f:
up.get('/upyun-python-sdk/xinu.png', f)下载成功,返回 Python None 对象; 失败则抛出相应异常。
up.mkdir('/upyun-python-sdk/temp/')创建成功,返回 Python None 对象; 失败则抛出相应异常。
up.delete('/upyun-python-sdk/xinu.png')
up.delete('/upyun-python-sdk/temp/')删除成功,返回 Python None 对象; 失败则抛出相应异常。注意删除目录时,必须保证目录为空。
res = up.getlist('/upyun-python-sdk/')获取成功,返回一个包含该目录下所有目录或文件条目信息的 Python List 对象:
[{'time': '1363247311', 'type': 'F', 'name': 'temp', 'size': '0'}, {'time': '1363247311', 'type': 'N', 'name': 'xinu.png', 'size': '477908'}]
其中每个条目信息是又是一个 Python Dict 对象:
item = res[0]
print item['name'] # 文件名称
print item['type'] # 文件类型
print item['size'] # 文件大小
print item['time'] # 创建时间获取失败,则抛出相应的异常。该方法默认获取根目录列表信息。
res = up.getinfo('/upyun-python-sdk/xinu.png')
print res['file-type']
print res['file-size']
print res['file-date']获取成功,返回一个 Python Dict 对象; 失败则抛出相应异常。
res = up.usage()获取成功,始终返回该空间当前使用的总容量,单位 Bytes,值类型为 Python String 对象; 失败则抛出相应异常。
try:
res = up.usage()
# do something else
except upyun.UpYunServiceException as se:
print 'Except an UpYunServiceException ...'
print 'Request Id: ' + se.request_id
print 'HTTP Status Code: ' + str(se.status)
print 'Error Message: ' + se.msg + '\n'
except upyun.UpYunClientException as ce:
print 'Except an UpYunClientException ...'
print 'Error Message: ' + ce.msg + '\n'其中, UpYunServiceException 主要是又拍云存储端返回的错误信息,具体错误代码请参考 标准 API 错误代码表; 而 UpYunClientException 则主要是一些客户端环境的异常,例如客户端网络超时等。
up = upyun.UpYun('bucket', 'username', 'password', chunksize=8192)当通过数据流方式上传和下载文件时,chunksize 决定了每次读操作的缓存区大小,默认 8192 字节。
例如,通过如下代码可以很容易实现上传下载的进度条显示:
from progressbar import *
class ProgressBarHandler(object):
def __init__(self, totalsize, params):
widgets = [params, Percentage(), ' ',
Bar(marker='=', left='[', right=']'), ' ',
ETA(), ' ', FileTransferSpeed()]
self.pbar = ProgressBar(widgets=widgets, maxval=totalsize).start()
def update(self, readsofar):
self.pbar.update(readsofar)
def finish(self):
self.pbar.finish()
with open('unix.png', 'rb') as f:
res = up.put('xinu.png', f, handler=ProgressBarHandler, params='Uploading ')
with open('xinu.png', 'wb') as f:
up.get('xinu.png', f, handler=ProgressBarHandler, params='Downloading ')with open('unix.png', 'rb') as f:
res = up.put('xinu.png', f, secret="abc")其中参数 secret 可指定具体密钥内容;默认 None,表示不设置密钥。特别地,该功能仅对配置了缩略图版本号的图片空间有效。
详见 又拍云存储 HTTP REST API 接口 中关于原图密钥保护的说明。
基于 又拍云缓存刷新 API 接口 开发,方便对 CDN 空间缓存资源进行主动刷新。
特别地,云存储空间正常情况下,资源更新则不需要额外提交刷新请求,缓存系统会自动进行处理。
>>> print up.purge('/upyun-python-sdk/xinu.png')
[]>>> print up.purge(['/unix.png', '/xinu.png'], domain='invalid.upyun.com')
['/unix.png', '/unix.png']支持提交单个或一组 URI 到缓存刷新队列,其中 domain 参数可特别指定为该空间对应的绑定域名作为本次刷新的域,默认其值为 None,表示始终使用默认域名。
提交成功,返回一个 Python List 对象,包含本次提交中无效的 URI 列表;失败则抛出相应异常。