Python循环调用JIRA工单创建函数仅执行一次问题排查
让我们一步步拆解你遇到的问题:
核心原因:请求失败但无反馈,循环因异常静默终止
你看到print([i])输出两行,但只有第一行创建了工单,本质是第二次请求因格式错误被JIRA拒绝,而你没有做任何错误检查,导致误以为函数没执行。具体细节如下:
1. CSV行未处理换行符,导致JSON格式非法
直接遍历csv_file读取的每行末尾带有\n换行符,你把它直接传入后,会被拼接到JSON字符串里。而JSON规范不允许字符串中出现未转义的换行符,这会导致JIRA返回400 Bad Request,请求直接失败。
2. 参数传递冗余错误:不必要的列表包装
你调用jira_rest_call([i])时把行内容包装成了列表,这会让JIRA工单的description显示为类似['PDFDownloader,Backend failed,100']的字符串,虽然不是导致仅执行一次的直接原因,但属于冗余错误,还可能引发其他格式问题。
3. 缺少错误处理与响应检查
你调用requests.post后没有检查响应状态码,也没有捕获网络/HTTP异常。一旦某次请求失败(比如JSON格式错误、认证问题),程序要么静默跳过,要么因未捕获的异常终止循环,你完全看不到失败的原因。
4. Headers被冗余覆盖(虽未直接影响,但需修复)
你先构造了包含Authorization的headers,随后又用headers={'Content-Type':'application/json'}直接覆盖,好在requests的auth参数会自动处理Basic认证,才没导致第一次请求失败,但这是不规范的写法,容易在后续引发问题。
修复后的完整代码
1. 修复JIRA调用函数:用JSON序列化替代字符串拼接
避免手动拼接JSON带来的格式问题,同时添加异常处理:
import requests from requests.auth import HTTPBasicAuth import json def jira_rest_call(description): # 构造工单字段字典 ticket_fields = { "project": {"id": "25102", "key": "ABC"}, "assignee": {"name": "USERID"}, "summary": "Pro active Monitoring", "issuetype": {"name": "Story"}, "description": description, "priority": {"name": "High"}, "labels": ["Production Failure"] } url = 'https://jira-abb.net/rest/api/2/issue' headers = {'Content-Type': 'application/json'} try: # 使用json参数自动序列化字典,避免格式错误 response = requests.post( url, auth=HTTPBasicAuth('Z683050', '*******'), headers=headers, json=ticket_fields ) # 主动抛出HTTP错误(4xx/5xx),便于捕获处理 response.raise_for_status() return response except requests.exceptions.RequestException as e: print(f"创建工单失败: {str(e)}") return None
2. 修复CSV读取与循环调用:正确解析每行并添加反馈
使用csv.reader规范解析CSV,处理换行符,同时打印请求结果:
import csv def jira_creation(): with open('test_duplicates_1.csv', 'r') as csv_file: # 用csv.reader解析每行,自动处理分隔符和换行 csv_reader = csv.reader(csv_file) for row in csv_reader: # 将行内容拼接成描述字符串 description = ','.join(row) print(f"正在创建工单,描述: {description}") response = jira_rest_call(description) if response and response.status_code == 201: print(f"✅ 工单创建成功,Key: {response.json()['key']}") else: print(f"❌ 工单创建失败")
为什么原来的代码只执行一次?
原来的代码中,第二行CSV内容带有\n换行符,手动拼接JSON时会生成非法的JSON字符串,JIRA返回400错误。如果你的代码没有捕获异常,可能在第二次请求时抛出未处理的HTTPError,导致循环直接终止,所以看起来只有第一行执行成功。
内容的提问来源于stack exchange,提问作者Harish P C

