Giter Club home page Giter Club logo

asyncoss's Introduction

Async Alibaba Cloud OSS SDK

Based on aiohttp and oss2, Require python3.6+

Installing

pip install asyncoss

Getting started

import asyncoss
import asyncio

endpoint = 'http://oss-cn-beijing.aliyuncs.com'

auth = asyncoss.Auth('<Your AccessKeyID>', '<Your AccessKeySecret>')

async def main():
    # The object key in the bucket is story.txt
    async with asyncoss.Bucket(auth, endpoint, '<your bucket name>') as bucket:
        key = 'story.txt'

        # Upload
        await bucket.put_object(key, 'Ali Baba is a happy youth.')

        # Download
        result = await bucket.get_object(key)
        await result.resp.read()

        # Delete
        await bucket.delete_object(key)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

asyncoss's People

Contributors

jerevia avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

asyncoss's Issues

sign_url 方法有问题

使用官方的可以正常签名,但是 asyncoss 的签名会报错。

复现

测试代码:

import asyncio
import asyncoss
import oss2

access_key_id = "机密access_key_id"
accesskey_id_secret = "机密accesskey_id_secret"
endpoint = "机密endpoint"
bucket = "机密bucket"
item = "机密路径"

# async_oss
async_oss_bucket = asyncoss.Bucket(
    asyncoss.Auth(access_key_id, accesskey_id_secret), endpoint, bucket
)

# official
official_oss_bucker = oss2.Bucket(
    oss2.Auth(access_key_id, accesskey_id_secret), endpoint, bucket
)


async def main():
    # sign url
    async_signed_url = async_oss_bucket.sign_url("GET", item, 300)
    official_signed_url = official_oss_bucker.sign_url("GET", item, 300)
    print("async_signed_url")
    print(async_signed_url)
    print("\n")
    print("official_signed_url")
    print(official_signed_url)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

asyncoss 返回链接的 XML 信息:

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
<RequestId><机密RequestId></RequestId>
<HostId><机密endpoint></HostId>
<OSSAccessKeyId><机密OSSAccessKeyId></OSSAccessKeyId>
<SignatureProvided><签名></SignatureProvided>
<StringToSign>
GET 1575427624 <机密OSS路径>
</StringToSign>
<StringToSignBytes>
47 ********** 67
</StringToSignBytes>
</Error>

可能原因:签名方法缺失 slash_safe

签名的方法定义在:

asyncoss/asyncoss/api.py

Lines 138 to 163 in ada3203

def sign_url(self, method, key, expires, headers=None, params=None):
"""生成签名URL。
常见的用法是生成加签的URL以供授信用户下载,如为log.jpg生成一个5分钟后过期的下载链接::
>>> bucket.sign_url('GET', 'log.jpg', 5 * 60)
'http://your-bucket.oss-cn-hangzhou.aliyuncs.com/logo.jpg?OSSAccessKeyId=YourAccessKeyId\&Expires=1447178011&Signature=UJfeJgvcypWq6Q%2Bm3IJcSHbvSak%3D'
:param method: HTTP方法,如'GET'、'PUT'、'DELETE'等
:type method: str
:param key: 文件名
:param expires: 过期时间(单位:秒),链接在当前时间再过expires秒后过期
:param headers: 需要签名的HTTP头部,如名称以x-oss-meta-开头的头部(作为用户自定义元数据)、
Content-Type头部等。对于下载,不需要填。
:type headers: 可以是dict,建议是oss2.CaseInsensitiveDict
:param params: 需要签名的HTTP查询参数
:return: 签名URL。
"""
key = to_string(key)
req = http.Request(method, self._make_url(self.bucket_name, key),
headers=headers,
params=params)
return self.auth._sign_url(req, self.bucket_name, key, expires)

官方 SDK 的方法定义在:

https://github.com/aliyun/aliyun-oss-python-sdk/blob/da3ce049859212e4cbd930e2d169cf10cad2d2f6/oss2/api.py#L404-L435

其中官方的 req 定义是:

req = http.Request(method, self._make_url(self.bucket_name, key, slash_safe),
                           headers=headers,
                           params=params)

而 asyncoss 的定义是:

req = http.Request(method, self._make_url(self.bucket_name, key),
                           headers=headers,
                           params=params)

需要补充 slash_safe 这个参数。


其他

sign_url async API

Hi, looks great, thanks!
Any way to add support for sign_url method to asyncio API ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.