From 81774b3b5fdcf895080d3da908473350b7e3d87b Mon Sep 17 00:00:00 2001 From: xiaomage Date: Sun, 20 Sep 2026 11:52:46 +0800 Subject: [PATCH 1/3] docs(examples): add capo Python SDK integration guide Add a capo (Python) example page under Developer > Examples in all five locales (en, zh, de, fr, ja), placed next to the boto3 page. The guide connects capo-s3, the S3 client package of the community-driven capo AWS SDK for Python, to RustFS using force_path_style path-style addressing, and covers bucket creation, object upload and listing, streaming get_object reads, presigned URLs, and the asynchronous client (AsyncS3Client with Body.async_from_path). Verified the code samples against a live RustFS instance with capo-s3 0.16.0: sync and async clients, pagination via iter_list_objects_v2, and anonymous fetch of a presigned URL. Closes rustfs/rustfs#8010 --- content/de/developer/examples/capo.md | 108 ++++++++++++++++++++++++ content/de/developer/examples/meta.json | 1 + content/en/developer/examples/capo.md | 108 ++++++++++++++++++++++++ content/en/developer/examples/meta.json | 1 + content/fr/developer/examples/capo.md | 108 ++++++++++++++++++++++++ content/fr/developer/examples/meta.json | 1 + content/ja/developer/examples/capo.md | 108 ++++++++++++++++++++++++ content/ja/developer/examples/meta.json | 1 + content/zh/developer/examples/capo.md | 108 ++++++++++++++++++++++++ content/zh/developer/examples/meta.json | 1 + 10 files changed, 545 insertions(+) create mode 100644 content/de/developer/examples/capo.md create mode 100644 content/en/developer/examples/capo.md create mode 100644 content/fr/developer/examples/capo.md create mode 100644 content/ja/developer/examples/capo.md create mode 100644 content/zh/developer/examples/capo.md diff --git a/content/de/developer/examples/capo.md b/content/de/developer/examples/capo.md new file mode 100644 index 00000000..03bf622b --- /dev/null +++ b/content/de/developer/examples/capo.md @@ -0,0 +1,108 @@ +--- +title: "capo (Python)" +description: "Verbinden Sie capo mit RustFS und führen Sie grundlegende Objektoperationen aus Python mit synchronen oder asynchronen Clients aus." +--- + +[capo](https://github.com/kap-sh/capo) ist ein von der Community entwickeltes AWS-SDK für Python, das vollständig typisierte Clients mit synchroner und asynchroner Unterstützung bietet. Der S3-Client wird als Paket [`capo-s3`](https://pypi.org/project/capo-s3/) ausgeliefert und verbindet sich über einen benutzerdefinierten Endpunkt mit RustFS. + +## Installation + +capo erfordert Python 3.10 oder höher: + +```bash +pip install capo-s3 +``` + +## Konfiguration + +Richten Sie den Client auf Ihren RustFS-Endpunkt aus. Ersetzen Sie `http://localhost:9000` durch Ihre Serveradresse und verwenden Sie Ihre eigenen [Zugriffsschlüssel](../../security-compliance/iam/access-token.md). RustFS erfordert pfadbasierte Adressierung, die capo nativ über `force_path_style` aktiviert: + +```python +from capo_s3 import Credentials, S3Client + +s3 = S3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, +) +``` + +## Verifikation + +Erstellen Sie einen Bucket, laden Sie ein Objekt hoch und listen Sie den Bucket auf: + +```python +s3.create_bucket(bucket="my-bucket") + +s3.put_object(bucket="my-bucket", key="hello.txt", body=b"hello RustFS\n") + +for obj in s3.list_objects_v2(bucket="my-bucket").get("contents", []): + print(obj["key"], obj["size"]) +``` + +Erwartete Ausgabe: + +```text +hello.txt 13 +``` + +Beim Zurücklesen gibt `get_object` eine Streaming-Antwort zurück, die als Kontextmanager verwendet wird: + +```python +with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join(response["body"]) + +print(content.decode()) +``` + +Sie können außerdem vorsignierte URLs generieren, die zeitlich begrenzten Zugriff ohne Anmeldeinformationen gewähren: + +```python +url = s3.presigned_get_object(bucket="my-bucket", key="hello.txt", expire_in=3600) +print(url) +``` + +## Asynchroner Client + +Der asynchrone Client akzeptiert dieselben Argumente und spiegelt jede Operation. Awaiten Sie jeden Aufruf und verwenden Sie asynchrone Kontextmanager für den Client sowie für Streaming-Antworten: + +```python +import asyncio + +from capo_s3 import AsyncS3Client, Body, Credentials + + +async def main() -> None: + async with AsyncS3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, + ) as s3: + await s3.create_bucket(bucket="my-bucket") + + await s3.put_object( + bucket="my-bucket", + key="hello.txt", + body=Body.async_from_path("/path/to/hello.txt"), + ) + + async with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join([chunk async for chunk in response["body"]]) + + print(content.decode()) + + +asyncio.run(main()) +``` + +## Nächste Schritte + +Die paginierte Auflistung folgt derselben Konvention — `iter_list_objects_v2` iteriert über die Ergebnisse. Informationen zur offiziellen AWS-SDK-Alternative finden Sie unter [boto3 (Python)](./boto3.md); weitere Sprachen finden Sie in der [S3-SDK-Übersicht](../sdk/index.md). diff --git a/content/de/developer/examples/meta.json b/content/de/developer/examples/meta.json index 35a973ec..a42f6323 100644 --- a/content/de/developer/examples/meta.json +++ b/content/de/developer/examples/meta.json @@ -6,6 +6,7 @@ "[s3cmd](/de/developer/examples/s3cmd)", "[rclone](/de/developer/examples/rclone)", "[boto3 (Python)](/de/developer/examples/boto3)", + "[capo (Python)](/de/developer/examples/capo)", "[AWS SDK for JavaScript](/de/developer/examples/aws-sdk-js)", "[AWS SDK for Go](/de/developer/examples/aws-sdk-go)", "[Terraform](/de/developer/examples/terraform)" diff --git a/content/en/developer/examples/capo.md b/content/en/developer/examples/capo.md new file mode 100644 index 00000000..53262abb --- /dev/null +++ b/content/en/developer/examples/capo.md @@ -0,0 +1,108 @@ +--- +title: "capo (Python)" +description: "Connect capo to RustFS and perform basic object operations from Python with synchronous or asynchronous clients." +--- + +[capo](https://github.com/kap-sh/capo) is a community-driven AWS SDK for Python offering fully typed clients with both synchronous and asynchronous support out of the box. The S3 client ships as the [`capo-s3`](https://pypi.org/project/capo-s3/) package and connects to RustFS through a custom endpoint. + +## Install + +capo requires Python 3.10 or later: + +```bash +pip install capo-s3 +``` + +## Configure + +Point the client at your RustFS endpoint. Replace `http://localhost:9000` with your server address, and use your own [access keys](../../security-compliance/iam/access-token.md). RustFS requires path-style addressing, which capo enables natively through `force_path_style`: + +```python +from capo_s3 import Credentials, S3Client + +s3 = S3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, +) +``` + +## Verify + +Create a bucket, upload an object, and list the bucket: + +```python +s3.create_bucket(bucket="my-bucket") + +s3.put_object(bucket="my-bucket", key="hello.txt", body=b"hello RustFS\n") + +for obj in s3.list_objects_v2(bucket="my-bucket").get("contents", []): + print(obj["key"], obj["size"]) +``` + +Expected output: + +```text +hello.txt 13 +``` + +Read the object back — `get_object` returns a streaming response, used as a context manager: + +```python +with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join(response["body"]) + +print(content.decode()) +``` + +You can also generate presigned URLs that grant time-limited access without credentials: + +```python +url = s3.presigned_get_object(bucket="my-bucket", key="hello.txt", expire_in=3600) +print(url) +``` + +## Async client + +The asynchronous client accepts the same arguments and mirrors every operation. Await each call and use async context managers for the client and for streaming responses: + +```python +import asyncio + +from capo_s3 import AsyncS3Client, Body, Credentials + + +async def main() -> None: + async with AsyncS3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, + ) as s3: + await s3.create_bucket(bucket="my-bucket") + + await s3.put_object( + bucket="my-bucket", + key="hello.txt", + body=Body.async_from_path("/path/to/hello.txt"), + ) + + async with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join([chunk async for chunk in response["body"]]) + + print(content.decode()) + + +asyncio.run(main()) +``` + +## Next steps + +Paginated listing follows the same convention — `iter_list_objects_v2` iterates over results. For the official AWS SDK alternative, see [boto3 (Python)](./boto3.md), or see the [S3 SDK overview](../sdk/index.md) for more languages. diff --git a/content/en/developer/examples/meta.json b/content/en/developer/examples/meta.json index ae59fba8..87fef962 100644 --- a/content/en/developer/examples/meta.json +++ b/content/en/developer/examples/meta.json @@ -6,6 +6,7 @@ "[s3cmd](/en/developer/examples/s3cmd)", "[rclone](/en/developer/examples/rclone)", "[boto3 (Python)](/en/developer/examples/boto3)", + "[capo (Python)](/en/developer/examples/capo)", "[AWS SDK for JavaScript](/en/developer/examples/aws-sdk-js)", "[AWS SDK for Go](/en/developer/examples/aws-sdk-go)", "[Terraform](/en/developer/examples/terraform)" diff --git a/content/fr/developer/examples/capo.md b/content/fr/developer/examples/capo.md new file mode 100644 index 00000000..5aa4e3c5 --- /dev/null +++ b/content/fr/developer/examples/capo.md @@ -0,0 +1,108 @@ +--- +title: "capo (Python)" +description: "Connectez capo à RustFS et effectuez des opérations objet de base depuis Python avec des clients synchrones ou asynchrones." +--- + +[capo](https://github.com/kap-sh/capo) est un SDK AWS pour Python développé par la communauté, qui propose des clients entièrement typés avec prise en charge synchrone et asynchrone dès l'installation. Le client S3 est distribué dans le paquet [`capo-s3`](https://pypi.org/project/capo-s3/) et se connecte à RustFS via un point de terminaison personnalisé. + +## Installation + +capo nécessite Python 3.10 ou ultérieur : + +```bash +pip install capo-s3 +``` + +## Configuration + +Pointez le client vers votre point de terminaison RustFS. Remplacez `http://localhost:9000` par l'adresse de votre serveur et utilisez vos propres [clés d'accès](../../security-compliance/iam/access-token.md). RustFS exige l'adressage de type chemin, que capo active nativement via `force_path_style` : + +```python +from capo_s3 import Credentials, S3Client + +s3 = S3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, +) +``` + +## Vérification + +Créez un compartiment, téléversez un objet et listez le contenu du compartiment : + +```python +s3.create_bucket(bucket="my-bucket") + +s3.put_object(bucket="my-bucket", key="hello.txt", body=b"hello RustFS\n") + +for obj in s3.list_objects_v2(bucket="my-bucket").get("contents", []): + print(obj["key"], obj["size"]) +``` + +Sortie attendue : + +```text +hello.txt 13 +``` + +Pour relire l'objet, `get_object` renvoie une réponse en flux, à utiliser comme gestionnaire de contexte : + +```python +with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join(response["body"]) + +print(content.decode()) +``` + +Vous pouvez également générer des URL présignées qui accordent un accès limité dans le temps sans identifiants : + +```python +url = s3.presigned_get_object(bucket="my-bucket", key="hello.txt", expire_in=3600) +print(url) +``` + +## Client asynchrone + +Le client asynchrone accepte les mêmes arguments et propose les mêmes opérations. Utilisez `await` pour chaque appel ainsi que des gestionnaires de contexte asynchrones pour le client et pour les réponses en flux : + +```python +import asyncio + +from capo_s3 import AsyncS3Client, Body, Credentials + + +async def main() -> None: + async with AsyncS3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, + ) as s3: + await s3.create_bucket(bucket="my-bucket") + + await s3.put_object( + bucket="my-bucket", + key="hello.txt", + body=Body.async_from_path("/path/to/hello.txt"), + ) + + async with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join([chunk async for chunk in response["body"]]) + + print(content.decode()) + + +asyncio.run(main()) +``` + +## Prochaines étapes + +Le listage paginé suit la même convention — `iter_list_objects_v2` itère sur les résultats. Pour l'alternative officielle du SDK AWS, voir [boto3 (Python)](./boto3.md) ; la [présentation des SDK S3](../sdk/index.md) répertorie les autres langages. diff --git a/content/fr/developer/examples/meta.json b/content/fr/developer/examples/meta.json index 29fcb1e0..d9350081 100644 --- a/content/fr/developer/examples/meta.json +++ b/content/fr/developer/examples/meta.json @@ -6,6 +6,7 @@ "[s3cmd](/fr/developer/examples/s3cmd)", "[rclone](/fr/developer/examples/rclone)", "[boto3 (Python)](/fr/developer/examples/boto3)", + "[capo (Python)](/fr/developer/examples/capo)", "[AWS SDK for JavaScript](/fr/developer/examples/aws-sdk-js)", "[AWS SDK for Go](/fr/developer/examples/aws-sdk-go)", "[Terraform](/fr/developer/examples/terraform)" diff --git a/content/ja/developer/examples/capo.md b/content/ja/developer/examples/capo.md new file mode 100644 index 00000000..7db82117 --- /dev/null +++ b/content/ja/developer/examples/capo.md @@ -0,0 +1,108 @@ +--- +title: "capo (Python)" +description: "capo を RustFS に接続し、同期または非同期クライアントを使って Python から基本的なオブジェクト操作を行います。" +--- + +[capo](https://github.com/kap-sh/capo) は、完全な型付けを持つクライアントを同期・非同期の両方で提供するコミュニティ主導の Python 用 AWS SDK です。S3 クライアントは [`capo-s3`](https://pypi.org/project/capo-s3/) パッケージとして提供され、カスタムエンドポイント経由で RustFS に接続します。 + +## インストール + +capo には Python 3.10 以降が必要です: + +```bash +pip install capo-s3 +``` + +## 設定 + +クライアントを RustFS エンドポイントに向けます。`http://localhost:9000` を実際のサーバーアドレスに置き換え、独自の[アクセスキー](../../security-compliance/iam/access-token.md)を使用してください。RustFS はパス形式のアドレス指定を必要とします。capo では `force_path_style` でネイティブに有効化できます: + +```python +from capo_s3 import Credentials, S3Client + +s3 = S3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, +) +``` + +## 検証 + +バケットを作成し、オブジェクトをアップロードして、バケットの内容を一覧表示します: + +```python +s3.create_bucket(bucket="my-bucket") + +s3.put_object(bucket="my-bucket", key="hello.txt", body=b"hello RustFS\n") + +for obj in s3.list_objects_v2(bucket="my-bucket").get("contents", []): + print(obj["key"], obj["size"]) +``` + +予想される出力: + +```text +hello.txt 13 +``` + +オブジェクトの読み戻しでは、`get_object` がストリーミングレスポンスを返します。コンテキストマネージャーとして使用してください: + +```python +with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join(response["body"]) + +print(content.decode()) +``` + +認証情報なしで期間限定のアクセスを許可する署名付き URL を生成することもできます: + +```python +url = s3.presigned_get_object(bucket="my-bucket", key="hello.txt", expire_in=3600) +print(url) +``` + +## 非同期クライアント + +非同期クライアントは同じ引数を受け入れ、すべての操作に対応します。各呼び出しには `await` を使用し、クライアントとストリーミングレスポンスには非同期コンテキストマネージャーを使用します: + +```python +import asyncio + +from capo_s3 import AsyncS3Client, Body, Credentials + + +async def main() -> None: + async with AsyncS3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, + ) as s3: + await s3.create_bucket(bucket="my-bucket") + + await s3.put_object( + bucket="my-bucket", + key="hello.txt", + body=Body.async_from_path("/path/to/hello.txt"), + ) + + async with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join([chunk async for chunk in response["body"]]) + + print(content.decode()) + + +asyncio.run(main()) +``` + +## 次のステップ + +ページネーション付きの一覧表示も同じ規則に従います。`iter_list_objects_v2` が結果を反復処理します。公式の AWS SDK による代替としては [boto3 (Python)](./boto3.md) を、他の言語については [S3 SDK の概要](../sdk/index.md) を参照してください。 diff --git a/content/ja/developer/examples/meta.json b/content/ja/developer/examples/meta.json index f0b1b2b4..db21275e 100644 --- a/content/ja/developer/examples/meta.json +++ b/content/ja/developer/examples/meta.json @@ -6,6 +6,7 @@ "[s3cmd](/ja/developer/examples/s3cmd)", "[rclone](/ja/developer/examples/rclone)", "[boto3(Python)](/ja/developer/examples/boto3)", + "[capo(Python)](/ja/developer/examples/capo)", "[AWS SDK for JavaScript](/ja/developer/examples/aws-sdk-js)", "[AWS SDK for Go](/ja/developer/examples/aws-sdk-go)", "[Terraform](/ja/developer/examples/terraform)" diff --git a/content/zh/developer/examples/capo.md b/content/zh/developer/examples/capo.md new file mode 100644 index 00000000..8a38fee0 --- /dev/null +++ b/content/zh/developer/examples/capo.md @@ -0,0 +1,108 @@ +--- +title: "capo (Python)" +description: "将 capo 连接到 RustFS,并通过 Python 的同步或异步客户端执行基本对象操作。" +--- + +[capo](https://github.com/kap-sh/capo) 是一个社区驱动的 Python AWS SDK,开箱即用地提供完全类型标注的客户端,同时支持同步与异步调用。其 S3 客户端以 [`capo-s3`](https://pypi.org/project/capo-s3/) 包的形式发布,可通过自定义端点连接到 RustFS。 + +## 安装 + +capo 要求 Python 3.10 或更高版本: + +```bash +pip install capo-s3 +``` + +## 配置 + +将客户端指向您的 RustFS 端点。请将 `http://localhost:9000` 替换为您的服务器地址,并使用您自己的[访问密钥](../../security-compliance/iam/access-token.md)。RustFS 要求使用路径样式寻址,capo 可通过 `force_path_style` 原生开启: + +```python +from capo_s3 import Credentials, S3Client + +s3 = S3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, +) +``` + +## 验证 + +创建存储桶、上传对象并列出存储桶中的内容: + +```python +s3.create_bucket(bucket="my-bucket") + +s3.put_object(bucket="my-bucket", key="hello.txt", body=b"hello RustFS\n") + +for obj in s3.list_objects_v2(bucket="my-bucket").get("contents", []): + print(obj["key"], obj["size"]) +``` + +预期输出: + +```text +hello.txt 13 +``` + +读取对象时,`get_object` 会返回流式响应,需作为上下文管理器使用: + +```python +with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join(response["body"]) + +print(content.decode()) +``` + +您还可以生成预签名 URL,在无需凭据的情况下授予限时访问权限: + +```python +url = s3.presigned_get_object(bucket="my-bucket", key="hello.txt", expire_in=3600) +print(url) +``` + +## 异步客户端 + +异步客户端接受相同的参数,并镜像提供所有操作。调用时使用 `await`,客户端与流式响应则使用异步上下文管理器: + +```python +import asyncio + +from capo_s3 import AsyncS3Client, Body, Credentials + + +async def main() -> None: + async with AsyncS3Client( + region="us-east-1", + endpoint="http://localhost:9000", + credentials=Credentials( + access_key="", + secret_key="", + ), + force_path_style=True, + ) as s3: + await s3.create_bucket(bucket="my-bucket") + + await s3.put_object( + bucket="my-bucket", + key="hello.txt", + body=Body.async_from_path("/path/to/hello.txt"), + ) + + async with s3.get_object(bucket="my-bucket", key="hello.txt") as response: + content = b"".join([chunk async for chunk in response["body"]]) + + print(content.decode()) + + +asyncio.run(main()) +``` + +## 后续步骤 + +分页列举遵循相同的约定——使用 `iter_list_objects_v2` 迭代结果。如需官方 AWS SDK 替代方案,请参阅 [boto3 (Python)](./boto3.md);更多编程语言请参阅 [S3 SDK 概述](../sdk/index.md)。 diff --git a/content/zh/developer/examples/meta.json b/content/zh/developer/examples/meta.json index 8ae3c3a5..70287231 100644 --- a/content/zh/developer/examples/meta.json +++ b/content/zh/developer/examples/meta.json @@ -6,6 +6,7 @@ "[s3cmd](/zh/developer/examples/s3cmd)", "[rclone](/zh/developer/examples/rclone)", "[boto3 (Python)](/zh/developer/examples/boto3)", + "[capo (Python)](/zh/developer/examples/capo)", "[AWS SDK(JavaScript)](/zh/developer/examples/aws-sdk-js)", "[AWS SDK(Go)](/zh/developer/examples/aws-sdk-go)", "[Terraform](/zh/developer/examples/terraform)" From 5d0cde849833d60a43b61dffbcd8a109ede96934 Mon Sep 17 00:00:00 2001 From: xiaomage Date: Sun, 20 Sep 2026 12:16:58 +0800 Subject: [PATCH 2/3] docs(sdk): cross-link capo example from the Python SDK guide Point readers of developer/sdk/python.md (Boto3 guide) to the capo example page for a community SDK with native async support and full typing, in all five locales. The SDK section stays organized around the official AWS SDKs; capo remains documented as an example recipe. --- content/de/developer/sdk/python.md | 2 ++ content/en/developer/sdk/python.md | 2 ++ content/fr/developer/sdk/python.md | 2 ++ content/ja/developer/sdk/python.md | 2 ++ content/zh/developer/sdk/python.md | 4 +++- 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/content/de/developer/sdk/python.md b/content/de/developer/sdk/python.md index 922ec994..ca12f11a 100644 --- a/content/de/developer/sdk/python.md +++ b/content/de/developer/sdk/python.md @@ -285,3 +285,5 @@ def download_file(bucket, object_key, local_path): ``` For other operations (object tagging, bucket policies, and more), see the [Boto3 S3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) — every S3-compatible call works against RustFS the same way. + +If you prefer native async support and full type hints, the community-driven [capo](https://github.com/kap-sh/capo) SDK also works with RustFS — see the [capo (Python) example](../examples/capo.md). diff --git a/content/en/developer/sdk/python.md b/content/en/developer/sdk/python.md index 922ec994..ca12f11a 100644 --- a/content/en/developer/sdk/python.md +++ b/content/en/developer/sdk/python.md @@ -285,3 +285,5 @@ def download_file(bucket, object_key, local_path): ``` For other operations (object tagging, bucket policies, and more), see the [Boto3 S3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) — every S3-compatible call works against RustFS the same way. + +If you prefer native async support and full type hints, the community-driven [capo](https://github.com/kap-sh/capo) SDK also works with RustFS — see the [capo (Python) example](../examples/capo.md). diff --git a/content/fr/developer/sdk/python.md b/content/fr/developer/sdk/python.md index 922ec994..ca12f11a 100644 --- a/content/fr/developer/sdk/python.md +++ b/content/fr/developer/sdk/python.md @@ -285,3 +285,5 @@ def download_file(bucket, object_key, local_path): ``` For other operations (object tagging, bucket policies, and more), see the [Boto3 S3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) — every S3-compatible call works against RustFS the same way. + +If you prefer native async support and full type hints, the community-driven [capo](https://github.com/kap-sh/capo) SDK also works with RustFS — see the [capo (Python) example](../examples/capo.md). diff --git a/content/ja/developer/sdk/python.md b/content/ja/developer/sdk/python.md index 922ec994..ca12f11a 100644 --- a/content/ja/developer/sdk/python.md +++ b/content/ja/developer/sdk/python.md @@ -285,3 +285,5 @@ def download_file(bucket, object_key, local_path): ``` For other operations (object tagging, bucket policies, and more), see the [Boto3 S3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) — every S3-compatible call works against RustFS the same way. + +If you prefer native async support and full type hints, the community-driven [capo](https://github.com/kap-sh/capo) SDK also works with RustFS — see the [capo (Python) example](../examples/capo.md). diff --git a/content/zh/developer/sdk/python.md b/content/zh/developer/sdk/python.md index fd6f8173..4986d1c9 100644 --- a/content/zh/developer/sdk/python.md +++ b/content/zh/developer/sdk/python.md @@ -284,4 +284,6 @@ def download_file(bucket, object_key, local_path): print(f"Downloaded s3://{bucket}/{object_key} to {local_path}") ``` -有关其他操作(对象标签、存储桶策略等),请参阅 [Boto3 S3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html)。所有 S3 兼容调用都能以相同方式用于 RustFS。 \ No newline at end of file +有关其他操作(对象标签、存储桶策略等),请参阅 [Boto3 S3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html)。所有 S3 兼容调用都能以相同方式用于 RustFS。 + +如果需要原生异步支持和完整类型标注,社区驱动的 [capo](https://github.com/kap-sh/capo) SDK 同样可用于 RustFS——请参阅 [capo (Python) 示例](../examples/capo.md)。 \ No newline at end of file From 7f9cb520e2f4e9885657198794ea1ae76a611b22 Mon Sep 17 00:00:00 2001 From: xiaomage Date: Sun, 20 Sep 2026 13:50:27 +0800 Subject: [PATCH 3/3] docs(examples): reference capo from the boto3 pages Point Python users from the boto3 example (Next steps) to the capo example as a community-driven SDK with native async support and full typing, in all five locales. Together with the sdk/python.md cross-link, boto3 and capo now reference each other in both directions. --- content/de/developer/examples/boto3.md | 2 +- content/en/developer/examples/boto3.md | 2 +- content/fr/developer/examples/boto3.md | 2 +- content/ja/developer/examples/boto3.md | 2 +- content/zh/developer/examples/boto3.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/de/developer/examples/boto3.md b/content/de/developer/examples/boto3.md index 1f598b68..bd3f064d 100644 --- a/content/de/developer/examples/boto3.md +++ b/content/de/developer/examples/boto3.md @@ -50,4 +50,4 @@ hello.txt 12 ## Next steps -See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). +See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). If you prefer a community-driven SDK with native async support and full typing, see [capo (Python)](./capo.md). diff --git a/content/en/developer/examples/boto3.md b/content/en/developer/examples/boto3.md index 1f598b68..bd3f064d 100644 --- a/content/en/developer/examples/boto3.md +++ b/content/en/developer/examples/boto3.md @@ -50,4 +50,4 @@ hello.txt 12 ## Next steps -See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). +See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). If you prefer a community-driven SDK with native async support and full typing, see [capo (Python)](./capo.md). diff --git a/content/fr/developer/examples/boto3.md b/content/fr/developer/examples/boto3.md index 1f598b68..bd3f064d 100644 --- a/content/fr/developer/examples/boto3.md +++ b/content/fr/developer/examples/boto3.md @@ -50,4 +50,4 @@ hello.txt 12 ## Next steps -See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). +See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). If you prefer a community-driven SDK with native async support and full typing, see [capo (Python)](./capo.md). diff --git a/content/ja/developer/examples/boto3.md b/content/ja/developer/examples/boto3.md index 1f598b68..bd3f064d 100644 --- a/content/ja/developer/examples/boto3.md +++ b/content/ja/developer/examples/boto3.md @@ -50,4 +50,4 @@ hello.txt 12 ## Next steps -See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). +See the [S3 SDK overview](../sdk/index.md) for more languages, or manage objects with [`rc`](/operations/rc). If you prefer a community-driven SDK with native async support and full typing, see [capo (Python)](./capo.md). diff --git a/content/zh/developer/examples/boto3.md b/content/zh/developer/examples/boto3.md index 66968590..c66b4a0b 100644 --- a/content/zh/developer/examples/boto3.md +++ b/content/zh/developer/examples/boto3.md @@ -50,4 +50,4 @@ hello.txt 12 ## 后续步骤 -有关更多编程语言,请参阅 [S3 SDK 概述](../sdk/index.md);也可以使用 [`rc`](/operations/rc) 管理对象。 \ No newline at end of file +有关更多编程语言,请参阅 [S3 SDK 概述](../sdk/index.md);也可以使用 [`rc`](/operations/rc) 管理对象。如果更倾向于使用社区驱动、原生支持异步且带完整类型标注的 SDK,请参阅 [capo (Python)](./capo.md)。 \ No newline at end of file