1
0
mirror of https://github.com/django/django.git synced 2025-03-31 19:46:42 +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. If the task didn't succeed, an exception is raised.
This is to distinguish against the task returning None. 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") raise ValueError("Task has not finished yet")
return self._return_value
@property @property
def exception_class(self): def exception_class(self):
"""The exception raised by the task function""" """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 If your task function returns something, it can be retrieved from the
:attr:`django.tasks.TaskResult.return_value` attribute:: :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. 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 # assert result
self.assertEqual(result.status, ResultStatus.FAILED) self.assertEqual(result.status, ResultStatus.FAILED)
with self.assertRaisesMessage(ValueError, "Task failed"):
result.return_value
self.assertTrue(result.is_finished) self.assertTrue(result.is_finished)
self.assertIsNotNone(result.started_at) self.assertIsNotNone(result.started_at)
self.assertIsNotNone(result.finished_at) self.assertIsNotNone(result.finished_at)
@ -111,6 +113,8 @@ class ImmediateBackendTestCase(SimpleTestCase):
result = test_tasks.complex_exception.enqueue() result = test_tasks.complex_exception.enqueue()
self.assertEqual(result.status, ResultStatus.FAILED) self.assertEqual(result.status, ResultStatus.FAILED)
with self.assertRaisesMessage(ValueError, "Task failed"):
result.return_value
self.assertIsNotNone(result.started_at) self.assertIsNotNone(result.started_at)
self.assertIsNotNone(result.finished_at) self.assertIsNotNone(result.finished_at)
self.assertGreaterEqual(result.started_at, result.enqueued_at) self.assertGreaterEqual(result.started_at, result.enqueued_at)