Python变量会随对象删除消失?Okta用户删除API异常排查
问题:Okta用户删除两次请求触发JSONDecodeError
我是Python新手,尝试通过API调用删除Okta中的用户。Okta要求执行两次相同的DELETE请求:第一次禁用账号,第二次彻底删除用户。我编写了两个函数:一个通过邮箱检索用户ID,另一个通过ID删除用户。在Postman中连续调用两次API可正常工作,但用以下Python代码实现时,第一次调用返回204成功,第二次出现JSONDecodeError错误。
代码片段
okta_user = okta.user_search(login) okta_id = okta_user[0]["id"] for _ in range(2): okta.user_delete(okta_id)
报错信息
DEBUG: https://fakeoktaaddress.com:443 "DELETE //api/v1/users/00u7ngjk6u2fkJR7o1d7 HTTP/1.1" 204 0 Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/requests/models.py", line 971, in json return complexjson.loads(self.text, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/__init__.py", line 346, in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "./offboard.py", line 51, in <module> okta.user_delete(okta_id) File "/calls/calls.py", line 151, in user_delete logging.info(response.json()) ^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/requests/models.py", line 975, in json raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我推测第二次循环时Python会重新执行获取okta_id的代码,导致搜索已禁用用户失败,怀疑对象被删除后变量存储的信息也被删除。已尝试元组和全局变量,问题依旧。请问哪里操作错误,该如何解决?
解决方案
你的推测不成立:okta_id是在循环外定义的,循环内部不会重新执行获取ID的逻辑。问题根源在user_delete函数的实现:
- Okta的DELETE请求返回204状态码时,响应体是空的,没有任何JSON内容。你在函数里强制调用
response.json(),第二次请求(彻底删除用户)同样返回204,解析空内容直接触发JSONDecodeError。Postman能正常工作是因为它不会自动尝试解析空响应体为JSON。
具体修复步骤
- 修改
user_delete函数:先判断响应状态码,仅在非204时解析JSON
def user_delete(self, user_id): url = f"{self.base_url}/api/v1/users/{user_id}" response = self.session.delete(url) # 先确保请求成功,若失败直接抛出异常 response.raise_for_status() # 仅当响应有内容时才解析JSON if response.status_code != 204: logging.info(response.json()) return response
- 添加请求延迟(可选但推荐):Okta的状态同步可能存在短暂延迟,连续调用前加1秒等待,避免潜在的状态不同步问题
import time okta_user = okta.user_search(login) okta_id = okta_user[0]["id"] for _ in range(2): okta.user_delete(okta_id) time.sleep(1) # 等待1秒再执行下一次请求
内容的提问来源于stack exchange,提问作者Alvaro
相关产品推荐
相关产品推荐

