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

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。

具体修复步骤

  1. 修改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
  1. 添加请求延迟(可选但推荐):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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:46