From d2e34be0f6240b081b45f08efa2737f7ce62271a Mon Sep 17 00:00:00 2001 From: Tang Vu Date: Sat, 28 Mar 2026 04:19:28 +0700 Subject: [PATCH] refactor: celery task result endpoint crashes on task failure When a Celery task fails, `result.ready()` evaluates to `True` but `result.successful()` is `False`. Calling `result.get()` without `propagate=False` on a failed task will re-raise the task's exception, causing the Flask endpoint to crash with a 500 Internal Server Error instead of returning the task's failed status. Additionally, if `result.result` is an Exception object, returning it directly in the dictionary will cause a `TypeError` during JSON serialization. Affected files: views.py Signed-off-by: Tang Vu --- examples/celery/src/task_app/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/celery/src/task_app/views.py b/examples/celery/src/task_app/views.py index 99cf92dc..7723a899 100644 --- a/examples/celery/src/task_app/views.py +++ b/examples/celery/src/task_app/views.py @@ -11,10 +11,12 @@ bp = Blueprint("tasks", __name__, url_prefix="/tasks") def result(id: str) -> dict[str, object]: result = AsyncResult(id) ready = result.ready() + successful = result.successful() if ready else None + value = result.get() if successful else result.result return { "ready": ready, - "successful": result.successful() if ready else None, - "value": result.get() if ready else result.result, + "successful": successful, + "value": str(value) if isinstance(value, Exception) else value, }