cloudflare / cloudflare/cloudflare-python
Deadlock in mutually exclusive account_id and zone_id resolution raises erroneous ValueError
- 主要語言
- Python
- 星號
- 506
- 分支
- 148
- 平均合併
- 3 小時 15 分鐘
- 30 天內合併 PR
- 1
描述
### Confirm this is a Python library issue and not an underlying Cloudflare API issue.
- [x] This is an issue with the Python library
### Describe the bug
In multiple classes, there is logic that attempts to extract an `account_id` or `zone_id` from the base client object if they are not provided as arguments. The code then verifies that *exactly one* of these parameters is present.
The current implementation looks like this:
```python
if account_id is None:
account_id = self._client._get_account_id_path_param()
if zone_id is None:
zone_id = self._client._get_zone_id_path_param()
if account_id and zone_id:
raise ValueError("You cannot provide both account_id and zone_id")
```
### The Bug
Both `_get_account_id_path_param()` and `_get_zone_id_path_param()` actively raise a `ValueError` if the client does not possess the requested parameter. This inadvertently creates a deadlock:
* If you only provide one parameter (as required), the attempt to fetch the missing second parameter from the client throws a ValueError.
* To bypass the first two if statements without throwing an error, you would have to provide both parameters (either via arguments or the client). However, doing so triggers the third if statement, throwing a `ValueError` for providing both.
### Expected Behavior
The method should execute successfully, recognizing that exactly one mutually exclusive parameter (`account_id` or `zone_id`) was provided.
### Actual Behavior
A `ValueError` is incorrectly raised no matter what combination of `account_id` or `zone_id` is provided.
### Proposed Solution
There are two straightforward ways to resolve this deadlock:
* Wrap the parameter retrievals in a try...except block that catches and suppresses the `ValueError`s.
* Modify the `_get_*_path_param()` methods so they return `None` instead of throwing an exception when a parameter is missing.
### To Reproduce
I personally encountered this issue using `client.zero_trust.access.applications.list(account_id=account_id)`, but a quick search indicates this pattern appears in roughly 180 occurrences across the codebase.
1. Initalize the Cloudflare client with an API key
2. Retrieve the target account ID via searching or just first available, e.g. `account_id = next(tier(client.accounts.list())).id`
3. Attempt to fetch the applications list using only the `account_id`: `applications = client.zero_trust.access.applications.list(account_id=account_id)`
4. `ValueError` incorrectly raised: `Missing zone_id argument; Please provide it at the client level, e.g. Cloudflare(zone_id='abcd') or per method.`
### Code snippets
```Python
```
### OS
macOS 15.7.4
### Python version
3.13.11
### Library version
5.0.0b2
貢獻指南
研究方向
在程式碼庫中搜尋 _get_account_id_path_param、_get_zone_id_path_param 以及互斥的 account_id/zone_id 模式;從 zero_trust.access.applications.list 開始。重現 issue 中描述的僅使用 account_id 的呼叫,然後驗證只提供一個參數的 requests 不再引發缺少參數的 ValueError,而同時提供兩個參數仍會引發互斥錯誤。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- python
- 領域
- api
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100