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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:31:19