# SARM SDK
**资产风险管理平台 Python SDK**
[](https://python.org)
[](LICENSE)
SARM SDK 是 SARM(资产风险管理平台)的官方 Python SDK,提供了完整的 API 封装和数据模型,支持组织架构、软件成分、漏洞管理、安全问题等全业务流程的数据导入和管理。
## ✨ 主要特性
- 🚀 **简单易用**: 提供 Pythonic 的 API 接口,易于学习和使用
- 📊 **完整覆盖**: 支持平台所有核心功能模块
- 🔒 **类型安全**: 基于 Pydantic 提供完整的数据验证和类型提示
- 🔄 **批量操作**: 支持高效的批量数据导入和处理
- 🛡️ **异常处理**: 完善的错误处理和异常体系
- 📝 **丰富示例**: 提供详细的使用示例和最佳实践
## 📦 安装
```bash
pip install sarm-sdk
```
## 🚀 快速开始
### 基础使用
```python
from sarm_sdk import SARMClient
from sarm_sdk.models import OrganizeInsert, VulnInsert
# 初始化客户端
client = SARMClient(
base_url="https://your-platform-api.com",
token="your-bearer-token"
)
# 创建组织
org = OrganizeInsert(
organize_name="技术部",
organize_unique_id="ORG-001",
organize_punique_id="0",
status="active"
)
result = client.organizations.create(org, execute_release=True)
print(f"组织创建成功: {result.success_count}个")
# 刷新组织缓存(重要!)
client.organizations.refresh_cache()
# 创建漏洞
vuln = VulnInsert(
vuln_unique_id="VULN-001",
title="SQL注入漏洞",
description="存在SQL注入风险",
severity="high",
security_capability_unique_id="SAST-001"
)
result = client.vulnerabilities.create(vuln, execute_release=True)
print(f"漏洞创建成功: {result.success_count}个")
# 关闭客户端
client.close()
```
### 批量操作
```python
from sarm_sdk.models import ComponentInsert
# 批量创建软件成分
components = [
ComponentInsert(
component_unique_id="spring-boot-2.7.0",
component_name="Spring Boot",
component_version="2.7.0",
status="active",
asset_type="open_source_component",
ecosystem="Maven"
),
ComponentInsert(
component_unique_id="jackson-2.13.2",
component_name="Jackson",
component_version="2.13.2",
status="active",
asset_type="open_source_component",
ecosystem="Maven"
)
]
# 批量创建(支持最多1000条记录)
result = client.components.create_batch(components, execute_release=True)
print(f"批量创建完成: 总数{result.total_count}, 成功{result.success_count}, 失败{result.failed_count}")
# 查看失败的记录
for failed_item in result.failed_items:
print(f"失败: {failed_item.unique_id}, 原因: {failed_item.msg}")
```
## 📚 核心功能模块
### 1. 组织架构管理 (`client.organizations`)
```python
# 创建组织
client.organizations.create(org_data, execute_release=True)
# 批量创建组织
client.organizations.create_batch(org_list, execute_release=True)
# 刷新组织架构缓存(批量操作后必须调用)
client.organizations.refresh_cache()
# 获取组织架构树
tree = client.organizations.get_tree()
# 查询组织
result = client.organizations.get(organize_name="技术部", page=1, limit=50)
```
### 2. 漏洞管理 (`client.vulnerabilities`)
```python
# 创建漏洞
client.vulnerabilities.create(vuln_data, execute_release=True)
# 批量创建漏洞
client.vulnerabilities.create_batch(vuln_list, execute_release=True)
# 获取漏洞列表
result = client.vulnerabilities.get_list(severity="critical", page=1, limit=50)
```
### 3. 安全问题管理 (`client.security_issues`)
```python
# 创建安全问题
client.security_issues.create(issue_data, execute_release=True)
# 批量创建安全问题
client.security_issues.create_batch(issue_list, execute_release=True)
# 获取安全问题列表
result = client.security_issues.get_list(issue_level="critical")
```
### 4. 软件成分管理 (`client.components`)
```python
# 创建软件成分
client.components.create(component_data, execute_release=True)
# 批量创建软件成分
client.components.create_batch(component_list, execute_release=True)
# 获取软件成分列表
result = client.components.get_list(asset_type="open_source_component")
```
### 5. 应用载体管理 (`client.carriers`)
```python
# 创建应用载体
client.carriers.create(carrier_data, execute_release=True)
# 批量创建应用载体
client.carriers.create_batch(carrier_list, execute_release=True)
```
### 6. 安全能力管理 (`client.security_capabilities`)
```python
# 创建安全能力
client.security_capabilities.create(capability_data)
# 获取安全能力列表
result = client.security_capabilities.get_list()
```
## 🔧 高级特性
### 错误处理
```python
from sarm_sdk.exceptions import (
SARMException,
SARMAPIError,
SARMValidationError,
SARMNetworkError
)
try:
result = client.organizations.create(org_data)
except SARMValidationError as e:
print(f"数据验证失败: {e}")
print(f"字段错误: {e.field_errors}")
except SARMAPIError as e:
print(f"API调用失败: {e}")
print(f"状态码: {e.status_code}")
print(f"错误代码: {e.error_code}")
except SARMNetworkError as e:
print(f"网络错误: {e}")
except SARMException as e:
print(f"SDK错误: {e}")
```
### 客户端配置
```python
client = SARMClient(
base_url="https://api.platform.com",
token="your-token",
timeout=60, # 请求超时时间
max_retries=3, # 最大重试次数
retry_backoff_factor=0.5 # 重试退避因子
)
# 测试连接
if client.test_connection():
print("连接成功")
else:
print("连接失败")
```
### Execute-Release 参数
```python
# execute_release=True: 数据直接发布,跳过预处理
result = client.organizations.create(org_data, execute_release=True)
# execute_release=False 或不传: 数据进入预处理状态,等待审核
result = client.organizations.create(org_data, execute_release=False)
```
## 📖 数据模型
SDK 提供了完整的数据模型,支持数据验证和类型提示:
```python
from sarm_sdk.models import (
# 组织架构
OrganizeInsert, Organization, OrganizationTree,
# 漏洞管理
VulnInsert, Vulnerability, VulnCvss, VulnContext,
# 安全问题
IssueInsert, SecurityIssue,
# 软件成分
ComponentInsert, Component,
# 应用载体
CarrierInsert, Carrier,
# 安全能力
SecurityCapability,
# 响应模型
BatchOperationResult, SuccessResponse, ErrorResponse
)
```
## 🚨 重要注意事项
### 1. 数据导入顺序
建议按以下顺序导入数据,确保依赖关系正确:
```python
# 1. 安全能力(前置依赖)
client.security_capabilities.create_batch(capabilities)
# 2. 组织架构
client.organizations.create_batch(organizations, execute_release=True)
client.organizations.refresh_cache() # 必须刷新缓存!
# 3. 业务系统和应用载体
client.carriers.create_batch(carriers, execute_release=True)
# 4. 软件成分
client.components.create_batch(components, execute_release=True)
# 5. 漏洞数据
client.vulnerabilities.create_batch(vulnerabilities, execute_release=True)
# 6. 安全问题
client.security_issues.create_batch(issues, execute_release=True)
```
### 2. 批量操作限制
- 单次批量操作最大支持 **1000条** 记录
- 请求大小限制:最大 **10MB**
- 请求频率限制:每分钟最大 **1000次** 请求
### 3. 组织架构缓存
- 批量导入组织数据后 **必须** 调用 `refresh_cache()` 方法
- 缓存刷新是异步操作,大量数据可能需要等待
- 建议在业务低峰期执行批量操作
Raw data
{
"_id": null,
"home_page": "https://github.com/murphysec",
"name": "sarm-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "security, asset, risk, management, sdk, api",
"author": "Murphysec Team",
"author_email": "Murphysec Team <developer@murphysec.com>",
"download_url": "https://files.pythonhosted.org/packages/44/b0/d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb/sarm_sdk-1.0.13.tar.gz",
"platform": null,
"description": "# SARM SDK\r\n\r\n**\u8d44\u4ea7\u98ce\u9669\u7ba1\u7406\u5e73\u53f0 Python SDK**\r\n\r\n[](https://python.org)\r\n[](LICENSE)\r\n\r\nSARM SDK \u662f SARM\uff08\u8d44\u4ea7\u98ce\u9669\u7ba1\u7406\u5e73\u53f0\uff09\u7684\u5b98\u65b9 Python SDK\uff0c\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684 API \u5c01\u88c5\u548c\u6570\u636e\u6a21\u578b\uff0c\u652f\u6301\u7ec4\u7ec7\u67b6\u6784\u3001\u8f6f\u4ef6\u6210\u5206\u3001\u6f0f\u6d1e\u7ba1\u7406\u3001\u5b89\u5168\u95ee\u9898\u7b49\u5168\u4e1a\u52a1\u6d41\u7a0b\u7684\u6570\u636e\u5bfc\u5165\u548c\u7ba1\u7406\u3002\r\n\r\n## \u2728 \u4e3b\u8981\u7279\u6027\r\n\r\n- \ud83d\ude80 **\u7b80\u5355\u6613\u7528**: \u63d0\u4f9b Pythonic \u7684 API \u63a5\u53e3\uff0c\u6613\u4e8e\u5b66\u4e60\u548c\u4f7f\u7528\r\n- \ud83d\udcca **\u5b8c\u6574\u8986\u76d6**: \u652f\u6301\u5e73\u53f0\u6240\u6709\u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n- \ud83d\udd12 **\u7c7b\u578b\u5b89\u5168**: \u57fa\u4e8e Pydantic \u63d0\u4f9b\u5b8c\u6574\u7684\u6570\u636e\u9a8c\u8bc1\u548c\u7c7b\u578b\u63d0\u793a\r\n- \ud83d\udd04 **\u6279\u91cf\u64cd\u4f5c**: \u652f\u6301\u9ad8\u6548\u7684\u6279\u91cf\u6570\u636e\u5bfc\u5165\u548c\u5904\u7406\r\n- \ud83d\udee1\ufe0f **\u5f02\u5e38\u5904\u7406**: \u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u548c\u5f02\u5e38\u4f53\u7cfb\r\n- \ud83d\udcdd **\u4e30\u5bcc\u793a\u4f8b**: \u63d0\u4f9b\u8be6\u7ec6\u7684\u4f7f\u7528\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\r\n\r\n## \ud83d\udce6 \u5b89\u88c5\r\n\r\n```bash\r\npip install sarm-sdk\r\n```\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u57fa\u7840\u4f7f\u7528\r\n\r\n```python\r\nfrom sarm_sdk import SARMClient\r\nfrom sarm_sdk.models import OrganizeInsert, VulnInsert\r\n\r\n# \u521d\u59cb\u5316\u5ba2\u6237\u7aef\r\nclient = SARMClient(\r\n base_url=\"https://your-platform-api.com\",\r\n token=\"your-bearer-token\"\r\n)\r\n\r\n# \u521b\u5efa\u7ec4\u7ec7\r\norg = OrganizeInsert(\r\n organize_name=\"\u6280\u672f\u90e8\",\r\n organize_unique_id=\"ORG-001\",\r\n organize_punique_id=\"0\",\r\n status=\"active\"\r\n)\r\nresult = client.organizations.create(org, execute_release=True)\r\nprint(f\"\u7ec4\u7ec7\u521b\u5efa\u6210\u529f: {result.success_count}\u4e2a\")\r\n\r\n# \u5237\u65b0\u7ec4\u7ec7\u7f13\u5b58\uff08\u91cd\u8981\uff01\uff09\r\nclient.organizations.refresh_cache()\r\n\r\n# \u521b\u5efa\u6f0f\u6d1e\r\nvuln = VulnInsert(\r\n vuln_unique_id=\"VULN-001\",\r\n title=\"SQL\u6ce8\u5165\u6f0f\u6d1e\",\r\n description=\"\u5b58\u5728SQL\u6ce8\u5165\u98ce\u9669\",\r\n severity=\"high\",\r\n security_capability_unique_id=\"SAST-001\"\r\n)\r\nresult = client.vulnerabilities.create(vuln, execute_release=True)\r\nprint(f\"\u6f0f\u6d1e\u521b\u5efa\u6210\u529f: {result.success_count}\u4e2a\")\r\n\r\n# \u5173\u95ed\u5ba2\u6237\u7aef\r\nclient.close()\r\n```\r\n\r\n### \u6279\u91cf\u64cd\u4f5c\r\n\r\n```python\r\nfrom sarm_sdk.models import ComponentInsert\r\n\r\n# \u6279\u91cf\u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\ncomponents = [\r\n ComponentInsert(\r\n component_unique_id=\"spring-boot-2.7.0\",\r\n component_name=\"Spring Boot\",\r\n component_version=\"2.7.0\",\r\n status=\"active\",\r\n asset_type=\"open_source_component\",\r\n ecosystem=\"Maven\"\r\n ),\r\n ComponentInsert(\r\n component_unique_id=\"jackson-2.13.2\",\r\n component_name=\"Jackson\",\r\n component_version=\"2.13.2\", \r\n status=\"active\",\r\n asset_type=\"open_source_component\",\r\n ecosystem=\"Maven\"\r\n )\r\n]\r\n\r\n# \u6279\u91cf\u521b\u5efa\uff08\u652f\u6301\u6700\u591a1000\u6761\u8bb0\u5f55\uff09\r\nresult = client.components.create_batch(components, execute_release=True)\r\nprint(f\"\u6279\u91cf\u521b\u5efa\u5b8c\u6210: \u603b\u6570{result.total_count}, \u6210\u529f{result.success_count}, \u5931\u8d25{result.failed_count}\")\r\n\r\n# \u67e5\u770b\u5931\u8d25\u7684\u8bb0\u5f55\r\nfor failed_item in result.failed_items:\r\n print(f\"\u5931\u8d25: {failed_item.unique_id}, \u539f\u56e0: {failed_item.msg}\")\r\n```\r\n\r\n## \ud83d\udcda \u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n\r\n### 1. \u7ec4\u7ec7\u67b6\u6784\u7ba1\u7406 (`client.organizations`)\r\n\r\n```python\r\n# \u521b\u5efa\u7ec4\u7ec7\r\nclient.organizations.create(org_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u7ec4\u7ec7\r\nclient.organizations.create_batch(org_list, execute_release=True)\r\n\r\n# \u5237\u65b0\u7ec4\u7ec7\u67b6\u6784\u7f13\u5b58\uff08\u6279\u91cf\u64cd\u4f5c\u540e\u5fc5\u987b\u8c03\u7528\uff09\r\nclient.organizations.refresh_cache()\r\n\r\n# \u83b7\u53d6\u7ec4\u7ec7\u67b6\u6784\u6811\r\ntree = client.organizations.get_tree()\r\n\r\n# \u67e5\u8be2\u7ec4\u7ec7\r\nresult = client.organizations.get(organize_name=\"\u6280\u672f\u90e8\", page=1, limit=50)\r\n```\r\n\r\n### 2. \u6f0f\u6d1e\u7ba1\u7406 (`client.vulnerabilities`)\r\n\r\n```python\r\n# \u521b\u5efa\u6f0f\u6d1e\r\nclient.vulnerabilities.create(vuln_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u6f0f\u6d1e\r\nclient.vulnerabilities.create_batch(vuln_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u6f0f\u6d1e\u5217\u8868\r\nresult = client.vulnerabilities.get_list(severity=\"critical\", page=1, limit=50)\r\n```\r\n\r\n### 3. \u5b89\u5168\u95ee\u9898\u7ba1\u7406 (`client.security_issues`)\r\n\r\n```python\r\n# \u521b\u5efa\u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create(issue_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create_batch(issue_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u5b89\u5168\u95ee\u9898\u5217\u8868\r\nresult = client.security_issues.get_list(issue_level=\"critical\")\r\n```\r\n\r\n### 4. \u8f6f\u4ef6\u6210\u5206\u7ba1\u7406 (`client.components`)\r\n\r\n```python\r\n# \u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\nclient.components.create(component_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\nclient.components.create_batch(component_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u8f6f\u4ef6\u6210\u5206\u5217\u8868\r\nresult = client.components.get_list(asset_type=\"open_source_component\")\r\n```\r\n\r\n### 5. \u5e94\u7528\u8f7d\u4f53\u7ba1\u7406 (`client.carriers`)\r\n\r\n```python\r\n# \u521b\u5efa\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create(carrier_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create_batch(carrier_list, execute_release=True)\r\n```\r\n\r\n### 6. \u5b89\u5168\u80fd\u529b\u7ba1\u7406 (`client.security_capabilities`)\r\n\r\n```python\r\n# \u521b\u5efa\u5b89\u5168\u80fd\u529b\r\nclient.security_capabilities.create(capability_data)\r\n\r\n# \u83b7\u53d6\u5b89\u5168\u80fd\u529b\u5217\u8868\r\nresult = client.security_capabilities.get_list()\r\n```\r\n\r\n## \ud83d\udd27 \u9ad8\u7ea7\u7279\u6027\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\n```python\r\nfrom sarm_sdk.exceptions import (\r\n SARMException,\r\n SARMAPIError, \r\n SARMValidationError,\r\n SARMNetworkError\r\n)\r\n\r\ntry:\r\n result = client.organizations.create(org_data)\r\nexcept SARMValidationError as e:\r\n print(f\"\u6570\u636e\u9a8c\u8bc1\u5931\u8d25: {e}\")\r\n print(f\"\u5b57\u6bb5\u9519\u8bef: {e.field_errors}\")\r\nexcept SARMAPIError as e:\r\n print(f\"API\u8c03\u7528\u5931\u8d25: {e}\")\r\n print(f\"\u72b6\u6001\u7801: {e.status_code}\")\r\n print(f\"\u9519\u8bef\u4ee3\u7801: {e.error_code}\")\r\nexcept SARMNetworkError as e:\r\n print(f\"\u7f51\u7edc\u9519\u8bef: {e}\")\r\nexcept SARMException as e:\r\n print(f\"SDK\u9519\u8bef: {e}\")\r\n```\r\n\r\n### \u5ba2\u6237\u7aef\u914d\u7f6e\r\n\r\n```python\r\nclient = SARMClient(\r\n base_url=\"https://api.platform.com\",\r\n token=\"your-token\",\r\n timeout=60, # \u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\r\n max_retries=3, # \u6700\u5927\u91cd\u8bd5\u6b21\u6570\r\n retry_backoff_factor=0.5 # \u91cd\u8bd5\u9000\u907f\u56e0\u5b50\r\n)\r\n\r\n# \u6d4b\u8bd5\u8fde\u63a5\r\nif client.test_connection():\r\n print(\"\u8fde\u63a5\u6210\u529f\")\r\nelse:\r\n print(\"\u8fde\u63a5\u5931\u8d25\")\r\n```\r\n\r\n### Execute-Release \u53c2\u6570\r\n\r\n```python\r\n# execute_release=True: \u6570\u636e\u76f4\u63a5\u53d1\u5e03\uff0c\u8df3\u8fc7\u9884\u5904\u7406\r\nresult = client.organizations.create(org_data, execute_release=True)\r\n\r\n# execute_release=False \u6216\u4e0d\u4f20: \u6570\u636e\u8fdb\u5165\u9884\u5904\u7406\u72b6\u6001\uff0c\u7b49\u5f85\u5ba1\u6838\r\nresult = client.organizations.create(org_data, execute_release=False)\r\n```\r\n\r\n## \ud83d\udcd6 \u6570\u636e\u6a21\u578b\r\n\r\nSDK \u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u6570\u636e\u6a21\u578b\uff0c\u652f\u6301\u6570\u636e\u9a8c\u8bc1\u548c\u7c7b\u578b\u63d0\u793a\uff1a\r\n\r\n```python\r\nfrom sarm_sdk.models import (\r\n # \u7ec4\u7ec7\u67b6\u6784\r\n OrganizeInsert, Organization, OrganizationTree,\r\n \r\n # \u6f0f\u6d1e\u7ba1\u7406 \r\n VulnInsert, Vulnerability, VulnCvss, VulnContext,\r\n \r\n # \u5b89\u5168\u95ee\u9898\r\n IssueInsert, SecurityIssue,\r\n \r\n # \u8f6f\u4ef6\u6210\u5206\r\n ComponentInsert, Component,\r\n \r\n # \u5e94\u7528\u8f7d\u4f53\r\n CarrierInsert, Carrier,\r\n \r\n # \u5b89\u5168\u80fd\u529b\r\n SecurityCapability,\r\n \r\n # \u54cd\u5e94\u6a21\u578b\r\n BatchOperationResult, SuccessResponse, ErrorResponse\r\n)\r\n```\r\n\r\n## \ud83d\udea8 \u91cd\u8981\u6ce8\u610f\u4e8b\u9879\r\n\r\n### 1. \u6570\u636e\u5bfc\u5165\u987a\u5e8f\r\n\r\n\u5efa\u8bae\u6309\u4ee5\u4e0b\u987a\u5e8f\u5bfc\u5165\u6570\u636e\uff0c\u786e\u4fdd\u4f9d\u8d56\u5173\u7cfb\u6b63\u786e\uff1a\r\n\r\n```python\r\n# 1. \u5b89\u5168\u80fd\u529b\uff08\u524d\u7f6e\u4f9d\u8d56\uff09\r\nclient.security_capabilities.create_batch(capabilities)\r\n\r\n# 2. \u7ec4\u7ec7\u67b6\u6784\r\nclient.organizations.create_batch(organizations, execute_release=True)\r\nclient.organizations.refresh_cache() # \u5fc5\u987b\u5237\u65b0\u7f13\u5b58\uff01\r\n\r\n# 3. \u4e1a\u52a1\u7cfb\u7edf\u548c\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create_batch(carriers, execute_release=True)\r\n\r\n# 4. \u8f6f\u4ef6\u6210\u5206\r\nclient.components.create_batch(components, execute_release=True)\r\n\r\n# 5. \u6f0f\u6d1e\u6570\u636e\r\nclient.vulnerabilities.create_batch(vulnerabilities, execute_release=True)\r\n\r\n# 6. \u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create_batch(issues, execute_release=True)\r\n```\r\n\r\n### 2. \u6279\u91cf\u64cd\u4f5c\u9650\u5236\r\n\r\n- \u5355\u6b21\u6279\u91cf\u64cd\u4f5c\u6700\u5927\u652f\u6301 **1000\u6761** \u8bb0\u5f55\r\n- \u8bf7\u6c42\u5927\u5c0f\u9650\u5236\uff1a\u6700\u5927 **10MB**\r\n- \u8bf7\u6c42\u9891\u7387\u9650\u5236\uff1a\u6bcf\u5206\u949f\u6700\u5927 **1000\u6b21** \u8bf7\u6c42\r\n\r\n### 3. \u7ec4\u7ec7\u67b6\u6784\u7f13\u5b58\r\n\r\n- \u6279\u91cf\u5bfc\u5165\u7ec4\u7ec7\u6570\u636e\u540e **\u5fc5\u987b** \u8c03\u7528 `refresh_cache()` \u65b9\u6cd5\r\n- \u7f13\u5b58\u5237\u65b0\u662f\u5f02\u6b65\u64cd\u4f5c\uff0c\u5927\u91cf\u6570\u636e\u53ef\u80fd\u9700\u8981\u7b49\u5f85\r\n- \u5efa\u8bae\u5728\u4e1a\u52a1\u4f4e\u5cf0\u671f\u6267\u884c\u6279\u91cf\u64cd\u4f5c\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python SDK for SARM(Security Asset Risk Management) Platform",
"version": "1.0.13",
"project_urls": {
"Homepage": "https://www.murphysec.com"
},
"split_keywords": [
"security",
" asset",
" risk",
" management",
" sdk",
" api"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "24ecd32543692a6dc496c04a24f96fd178cf23fd85eea9f7a2ab39f8b707d9e3",
"md5": "7db20dc46fe2c2c487c6e476698aca53",
"sha256": "89377dbffc2eafd633850b9bf2bbd850acef52496ea1825f0666bb301d0107d6"
},
"downloads": -1,
"filename": "sarm_sdk-1.0.13-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7db20dc46fe2c2c487c6e476698aca53",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 42576,
"upload_time": "2025-07-17T17:03:29",
"upload_time_iso_8601": "2025-07-17T17:03:29.024607Z",
"url": "https://files.pythonhosted.org/packages/24/ec/d32543692a6dc496c04a24f96fd178cf23fd85eea9f7a2ab39f8b707d9e3/sarm_sdk-1.0.13-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "44b0d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb",
"md5": "586551bd5540669ec6e867865f53b9ea",
"sha256": "953f9514010c251e6fa320ef530d461fc559fb1dfc28d598be04d3526f01b48f"
},
"downloads": -1,
"filename": "sarm_sdk-1.0.13.tar.gz",
"has_sig": false,
"md5_digest": "586551bd5540669ec6e867865f53b9ea",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 30728,
"upload_time": "2025-07-17T17:03:30",
"upload_time_iso_8601": "2025-07-17T17:03:30.101645Z",
"url": "https://files.pythonhosted.org/packages/44/b0/d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb/sarm_sdk-1.0.13.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-17 17:03:30",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "sarm-sdk"
}