You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现MinIO的Get Bucket Quota功能

Python实现MinIO配额查询(等效于mc quota info)的解决方案

需求背景

需要用Python实现与以下mc CLI命令等效的功能:

mc quota info localhost-reporting-api/bucket-99

该命令输出:

Bucket bucket-99 has hard quota of 954 MiB

官方Python MinIO库未提供此功能,推测是出于AWS S3兼容性考量。通过查看MinIO的Go SDK源码(madmin-go/quota-commands.go),发现其实现逻辑:

// GetBucketQuota - get info on a user
func (adm *AdminClient) GetBucketQuota(ctx context.Context, bucket string) (q BucketQuota, err error) {
    queryValues := url.Values{}
    queryValues.Set("bucket", bucket)

    reqData := requestData{
        relPath:     adminAPIPrefix + "/get-bucket-quota",
        queryValues: queryValues,
    }
    // 后续请求逻辑...
}

其中adminAPIPrefix来自utils.go的定义:

// Admin API version prefix
adminAPIPrefix = "/" + AdminAPIVersion

MinIO当前的AdminAPIVersion为minio/admin/v4,因此完整的API路径是/minio/admin/v4/get-bucket-quota。

现有代码问题

你当前的尝试代码错误地将bucket名称作为路径参数传入_execute方法,导致请求被识别为普通的bucket列表请求,返回ListBucketResult。Admin API的请求路径与普通S3 API不同,不需要将bucket名称放在路径中,而是通过查询参数传递。

修正后的实现代码

from minio import Minio
from minio.error import S3Error
from minio.helpers import check_bucket_name, DictType, cast
import json

class MinioQuota(Minio):
    def get_bucket_quota(self, bucket_name: str):
        check_bucket_name(bucket_name, s3_check=self._base_url.is_aws_host)
        
        query_params = {"bucket": bucket_name}
        
        try:
            # 调用Admin API:GET /minio/admin/v4/get-bucket-quota?bucket=xxx
            response = self._execute(
                "GET",
                "",  # 空字符串表示不使用bucket路径前缀
                query_params=cast(DictType, query_params),
                rel_path="/minio/admin/v4/get-bucket-quota"
            )
            # 解析JSON响应,返回配额信息
            return json.loads(response.data.decode())
        except S3Error as exc:
            # 处理"无配额设置"的情况
            if exc.code == "NoSuchBucketQuota":
                return None
            # 其他异常直接抛出
            raise
        return None

使用示例

# 初始化客户端
client = MinioQuota(
    "localhost-reporting-api",
    access_key="your-access-key",
    secret_key="your-secret-key",
    secure=False
)

# 查询配额
quota = client.get_bucket_quota("bucket-99")
if quota:
    print(f"Bucket `bucket-99` has {quota['Type']} quota of {quota['Quota'] / (1024*1024)} MiB")
else:
    print("Bucket has no quota set")

关键说明

  • Admin API的请求路径是/minio/admin/v4/get-bucket-quota,需通过rel_path参数指定,而非依赖bucket路径前缀。
  • bucket名称通过查询参数bucket传递,而非路径参数。
  • 响应为JSON格式,包含Type(配额类型:hard/soft)和Quota(配额大小,单位字节)两个字段。

内容的提问来源于stack exchange,提问作者VagrantPaladin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:34:56