Postman调用时出现Maximum recursion depth exceeded问题求助
解决Maximum recursion depth exceeded问题方案
我编写了如下inactive_customer_cohorts函数代码,直接运行可得到正常输出,但通过Postman调用时返回500错误,提示"maximum recursion depth exceeded"。
函数代码
def inactive_customer_cohorts(startDate, endDate): try: print("startDate : ", startDate) print("endDate : ", endDate) df = data_util.get_customer_scans_df(startDate, endDate) columns = ['userId', 'createdAt'] df = df[columns] df['scanQuater'] = ('Q' + df['createdAt'].dt.quarter.astype(str) + '/' + df['createdAt'].dt.year.astype(str)) quartersMap = dict(zip(df['scanQuater'].unique(), range(len(df['scanQuater'].unique())))) scanQuarterUsers = df.groupby('scanQuater')['userId'].apply(list).reset_index() scanQuarterUsers['length'] = scanQuarterUsers['userId'].apply(len) quarterUsers = {row['scanQuater']: row['userId'] for _, row in scanQuarterUsers.iterrows()} quarters = list(quartersMap.keys()) cumulativePreviousUserIds = set() previousQuarterUserMap = {} data = [] for i in range(len(quarters)): currentQuarter = quarters[i] if currentQuarter in quarterUsers: nonUniquecurrentUserIds = quarterUsers[currentQuarter] currentUserIds = set(quarterUsers[currentQuarter]) currentCount = len(currentUserIds) nonUniqueCurrentCount = len(nonUniquecurrentUserIds) if cumulativePreviousUserIds: uniqueCommonUserIds = set() quarterCommonCounts = {} for prevQuarter, prevUserIds in previousQuarterUserMap.items(): specificCommonUserIds = currentUserIds.intersection(prevUserIds) for userId in specificCommonUserIds: if userId not in uniqueCommonUserIds: uniqueCommonUserIds.add(userId) if prevQuarter in quarterCommonCounts: quarterCommonCounts[prevQuarter] += 1 else: quarterCommonCounts[prevQuarter] = 1 previousQuartersSummary = ", ".join([f"{count} from {quarter}" for quarter, count in quarterCommonCounts.items()]) totalSpecificCommonCount = len(uniqueCommonUserIds) newUsers = currentCount - totalSpecificCommonCount data.append({ "quarter": currentQuarter, "scanCount": nonUniqueCurrentCount, "uniqueCounts": currentCount, "common": totalSpecificCommonCount, "new": newUsers, "common_breakdown": previousQuartersSummary }) else: data.append({ "quarter": currentQuarter, "scanCount": nonUniqueCurrentCount, "uniqueCounts": currentCount, "common": 0, "new": currentCount, "common_breakdown": "" }) cumulativePreviousUserIds.update(currentUserIds) previousQuarterUserMap[currentQuarter] = currentUserIds df = pd.DataFrame(data) print(df) return df except Exception as e: common_util.error_logs(e, 'inactive_customer_cohorts') raise e
错误响应
{ "status": 500, "message": "maximum recursion depth exceeded", "data": {} }
解决方案
1. 排查依赖函数的递归逻辑
- 检查
data_util.get_customer_scans_df内部是否存在递归调用(比如递归查询数据、日期范围处理的递归重试); - 确认
common_util.error_logs是否有递归日志行为(比如日志函数内部触发了再次调用自身或其他递归逻辑)。
2. 修复DataFrame返回的序列化问题
API框架(如Flask、FastAPI)无法直接序列化Pandas DataFrame对象,可能触发递归解析错误。需将DataFrame转为可序列化格式:
# 替换原return df的代码 return df.to_dict('records') # 转为字典列表,适合大多数API返回 # 或根据框架要求使用 # return df.to_json(orient='records')
3. 临时调整递归深度(不推荐作为长期方案)
若确认是递归深度不足导致,可临时调高Python的递归限制,但可能引发栈溢出风险:
import sys # 在函数开头或项目初始化时设置 sys.setrecursionlimit(10000) # 按需调整数值
4. 校验Postman传递的日期参数
Postman传入的日期格式可能与本地运行时不同,导致get_customer_scans_df内部处理异常触发递归。添加参数格式校验:
from datetime import datetime def inactive_customer_cohorts(startDate, endDate): try: # 新增日期格式校验,根据实际预期格式调整 startDate = datetime.strptime(startDate, '%Y-%m-%d') endDate = datetime.strptime(endDate, '%Y-%m-%d') # 后续原有代码... except ValueError as e: raise ValueError(f"Invalid date format: {e}. Expected format YYYY-MM-DD") except Exception as e: common_util.error_logs(e, 'inactive_customer_cohorts') raise e
内容的提问来源于stack exchange,提问作者Kartikeya Kawadkar
相关产品推荐
相关产品推荐

