Python SDK V1到V2迁移指南

更新时间:2025-03-18 03:39:22

本文介绍如何从Python SDK V1版本迁移到Python SDK V2 版本。

最低Python版本

请注意,V2版本要求Python版本最低为3.8。

导入路径

V2版本使用新的代码仓库(alibabacloud-oss-python-sdk-v2),同时也对代码结构进行了调整,按照功能模块组织,以下是这些模块路径和说明:

模块路径

说明

模块路径

说明

alibabacloud_oss_v2

SDK核心,接口 和 高级接口实现

alibabacloud_oss_v2.credentials

访问凭证相关

alibabacloud_oss_v2.retry

重试相关

alibabacloud_oss_v2.signer

签名相关

alibabacloud_oss_v2.transport

HTTP客户端相关

alibabacloud_oss_v2.crypto

客户端加密相关

V1版示例

import oss2

V2版示例

import alibabacloud_oss_v2

配置加载

  1. V2 版本简化了配置设置方式,全部迁移到 config下,可以以编程方式覆盖缺省配置。

  2. V2 默认使用 V4签名,所以必须配置区域(Region)。

  3. V2 支持从区域(Region)信息构造访问域名(Endpoint), 当访问的是公网域名时,可以不设置Endpoint。

V1版示例

from oss2 import http
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 环境变量中获取访问凭证
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# 设置区域
region = "cn-hangzhou"

# 设置HTTP连接超时时间为20秒, HTTP读取或写入超时时间为60秒
bucket = oss2.Bucket(auth, endpoint, "example_bucket", region=region, connect_timeout=(20, 60))

# # 不校验SSL证书校验
# session = http.Session()
# session.session.verify = False
# bucket = oss2.Bucket(auth, endpoint, "example_bucket", region=region, session=session)

V2版示例

import alibabacloud_oss_v2 as oss

# 环境变量中获取访问凭证
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider

# 设置HTTP连接超时时间为20秒
cfg.connect_timeout = 20
# HTTP读取或写入超时时间为60秒
cfg.readwrite_timeout = 60
# 不校验SSL证书校验
cfg.insecure_skip_verify = True
# 设置区域
cfg.region = "cn-hangzhou"

client = oss.Client(cfg)

创建Client

V2 版本把Client的创建函数从Bucket包修改为Client包。

V1版示例

bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region) 

V2版示例

client = oss.Client(cfg)

调用API操作

基础API接口都合并为单一操作方法'<OperationName>',操作的请求参数为'<OperationName>Request',操作的返回值为'<OperationName>Result'。这些操作方法都迁移到Client下。如下格式:

def <OperationName>(self, request: models.<OperationName>Request, **kwargs) -> models.<OperationName>Result:

关于API接口的详细使用说明,请参考基础接口

V1版示例

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
region = "cn-hangzhou"
bucket = oss2.Bucket(auth, endpoint, "example_bucket", region=region)

result = bucket.put_object('exampleobject.txt', 'example data')

V2版示例

import alibabacloud_oss_v2 as oss

credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.region = "cn-hangzhou"
cfg.credentials_provider = credentials_provider

client = oss.Client(cfg)
result = client.put_object(oss.PutObjectRequest(
        bucket="example_bucket",
        key="exampleobject.txt",
        body="example data",
    ))

预签名

V2版本把预签名接口名字从SignURL修改为Presign,同时把接口迁移到Client下。接口形式如下:

def presign(self, request: PresignRequest, **kwargs) -> PresignResult:

对于request参数,其类型与API接口中的'<OperationName>Request'一致。

对于返回结果,除了返回预签名URL外,还返回HTTP方法,过期时间和被签名的请求头,如下:

class PresignResult:
    def __init__(
        self,
        method: Optional[str] = None,
        url: Optional[str] = None,
        expiration: Optional[datetime.datetime] = None,
        signed_headers: Optional[MutableMapping] = None,
    ) -> None:
        self.method = method
        self.url = url
        self.expiration = expiration
        self.signed_headers = signed_headers

关于预签名的详细使用说明,请参考预签名接口

以生成下载对象的预签名URL为例,如何从V1迁移到V2。

V1版示例

import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
region = "cn-hangzhou"
bucket = oss2.Bucket(auth, endpoint, "example_bucket", region=region)

object_name = "exampleobject.txt"

url = bucket.sign_url("GET", object_name, 60, slash_safe=True)
print('预签名URL的地址为:', url)   

V2版示例

import datetime
from typing import Dict, Any
import requests
import alibabacloud_oss_v2 as oss

credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = "cn-hangzhou"

client = oss.Client(cfg)

kwargs: Dict[str, Any] = {}
kwargs["expires"] = datetime.timedelta(minutes=10)

pre_result = client.presign(oss.GetObjectRequest(
    bucket="example_bucket",
    key="exampleobject.txt",
), **kwargs)

print(f'url: {pre_result.url}')

断点续传接口

V2版本使用传输管理器'Uploader''Downloader' 'Copier'分别管理对象的上传,下载和拷贝。 同时移除了原有的断点续传接口Bucket.UploadFileBucket.DownloadFileBucket.CopyFile

接口对比如下:

使用场景

v2

v1

使用场景

v2

v1

上传文件

Uploader.upload_file

bucket.put_object_from_file

上传流

Uploader.upload_from

不支持

下载到文件

Downloader.download_file

bucket.get_object_to_file

拷贝对象

Copier.copy

bucket.copy_object

默认参数的变化:

场景

v2

v1

场景

v2

v1

上传-分片默认值

6 MiB

通过参数设置

上传-并发默认值

3

1

上传-阈值

分片大小

上传-记录checkpoint

支持

支持

下载-分片默认值

6 MiB

通过参数设置

下载-并发默认值

3

1

下载-阈值

分片大小

下载-记录checkpoint

支持

支持

拷贝-分片默认值

64 MiB

拷贝-并发默认值

3

1

拷贝-阈值

200 MiB

拷贝-记录checkpoint

不支持

支持

说明

表格中的阈值(上传/下载拷贝)表示对象/文件大小大于该值时,使用分片方式(上传/下载/拷贝)。

关于传输管理器的详细使用说明,请参考传输管理器

客户端加密

V2版本使用EncryptionClient来提供客户端加密功能,同时也对API 接口做了精简,采用了和Client一样的接口命名规则和调用方式。另外,该版本仅保留基于RSA自主管理的主密钥的参考实现。

对于KMS的实现,可以参考sample/encryption_kms.py

关于客户端加密的详细使用说明,请参考客户端加密

下面以使用主密钥RSA上传对象为例,展示如何从 V1 迁移到 V2。

V1版本

import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.crypto import RsaProvider

auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

key_pair = {'private_key': 'yourPrivateKey', 'public_key': 'yourPublicKey'}

endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

region = "cn-hangzhou"

bucket = oss2.CryptoBucket(auth, endpoint, 'example_bucket',
                           crypto_provider=RsaProvider(key_pair), region=region)

bucket.put_object('exampleobject.txt', 'example data')

V2版本

import argparse
import alibabacloud_oss_v2 as oss

credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = "cn-hangzhou"

client = oss.Client(cfg)

mc = oss.crypto.MasterRsaCipher(
    mat_desc={"desc": "your master encrypt key material describe information"},
    public_key="yourRsaPublicKey",
    private_key="yourRsaPrivateKey"
)
encryption_client = oss.EncryptionClient(client, mc)

data = b'example data'

result = encryption_client.put_object(oss.PutObjectRequest(
    bucket="example_bucket",
    key="exampleobject.txt",
    body=data,
))

重试

V2版本默认开启对HTTP请求的重试行为。从V1版本迁移到V2时,您需要移除原有的重试代码,避免放大重试次数。

相关文档

关于Python SDK V1迁移到V2的更多内容,请参见迁移指南

  • 本页导读
  • 最低Python版本
  • 导入路径
  • 配置加载
  • 创建Client
  • 调用API操作
  • 预签名
  • 断点续传接口
  • 客户端加密
  • 重试
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等