1
0
mirror of https://github.com/django/django.git synced 2025-03-29 02:30:48 +00:00

Ensure return value can't be obtained for failed task

This commit is contained in:
Jake Howard 2024-12-13 16:10:20 +00:00
parent b98708fd33
commit 97fee0a3c0
No known key found for this signature in database
GPG Key ID: 57AFB45680EDD477
3 changed files with 11 additions and 4 deletions

View File

@ -224,11 +224,13 @@ class TaskResult:
If the task didn't succeed, an exception is raised.
This is to distinguish against the task returning None.
"""
if not self.is_finished:
if self.status == ResultStatus.SUCCEEDED:
return self._return_value
elif self.status == ResultStatus.FAILED:
raise ValueError("Task failed")
else:
raise ValueError("Task has not finished yet")
return self._return_value
@property
def exception_class(self):
"""The exception raised by the task function"""

View File

@ -315,7 +315,8 @@ Return values
If your task function returns something, it can be retrieved from the
:attr:`django.tasks.TaskResult.return_value` attribute::
result.return_value # 42
if result.status == ResultStatus.SUCCEEDED:
result.return_value # 42
If the task has not finished executing, or has failed, :exc:`ValueError` is raised.

View File

@ -82,6 +82,8 @@ class ImmediateBackendTestCase(SimpleTestCase):
# assert result
self.assertEqual(result.status, ResultStatus.FAILED)
with self.assertRaisesMessage(ValueError, "Task failed"):
result.return_value
self.assertTrue(result.is_finished)
self.assertIsNotNone(result.started_at)
self.assertIsNotNone(result.finished_at)
@ -111,6 +113,8 @@ class ImmediateBackendTestCase(SimpleTestCase):
result = test_tasks.complex_exception.enqueue()
self.assertEqual(result.status, ResultStatus.FAILED)
with self.assertRaisesMessage(ValueError, "Task failed"):
result.return_value
self.assertIsNotNone(result.started_at)
self.assertIsNotNone(result.finished_at)
self.assertGreaterEqual(result.started_at, result.enqueued_at)