fix: 图片生成失败后重试 前端一直显示生成中

This commit is contained in:
yangshilin
2026-03-13 16:23:51 +08:00
parent e751114354
commit 672abf5ec7
7 changed files with 105 additions and 43 deletions

View File

@@ -55,10 +55,6 @@ logger = logging.getLogger(__name__)
_REDIS_CLIENTS: dict[bool, redis.Redis] = {}
class PermanentImageGenerationError(RuntimeError):
"""Raised when chapter image generation hits a non-retryable failure."""
def _get_redis_client(*, decode_responses: bool = False) -> redis.Redis:
client = _REDIS_CLIENTS.get(decode_responses)
if client is None:
@@ -930,35 +926,31 @@ def generate_chapter_images(self, chapter_id: str):
current_item["url"],
)
except Exception as exc:
current_item["status"] = IMAGE_STATUS_FAILED
current_item["error"] = str(exc)
failure_msg = f"section_index={sec_index}, error={exc}"
if isinstance(exc, CosUploadError) and not exc.retryable:
current_item["retryable"] = False
permanent_failures.append(failure_msg)
logger.error("图片上传不可重试: chapter=%s, %s", chapter_id, failure_msg)
logger.error("图片上传不可重试,清理配图: chapter=%s, %s", chapter_id, failure_msg)
mi = section.image_record
section.image_id = None
if mi:
db.delete(mi)
db.commit()
else:
current_item["status"] = IMAGE_STATUS_FAILED
current_item["error"] = str(exc)
current_item["retryable"] = True
retryable_failures.append(failure_msg)
logger.warning("图片生成失败(可重试): chapter=%s, %s", chapter_id, failure_msg)
current_item["updated_at"] = datetime.now(timezone.utc).isoformat()
_apply_item_to_memoir_image(section.image_record, current_item)
db.commit()
current_item["updated_at"] = datetime.now(timezone.utc).isoformat()
_apply_item_to_memoir_image(section.image_record, current_item)
db.commit()
# 封面图先空着,不自动用首张完成图做封面
if retryable_failures:
raise RuntimeError(
f"章节补图存在可重试失败项: chapter={chapter_id}, failures={'; '.join(retryable_failures)}"
)
if permanent_failures:
raise PermanentImageGenerationError(
f"章节补图存在不可重试失败项: chapter={chapter_id}, failures={'; '.join(permanent_failures)}"
)
return {"status": "success"}
except PermanentImageGenerationError as exc:
logger.error("章节补图任务失败(不重试): chapter=%s, error=%s", chapter_id, exc)
raise
except Exception as exc:
logger.error("章节补图任务失败: chapter=%s, error=%s", chapter_id, exc)
raise self.retry(exc=exc)