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:
parent
b98708fd33
commit
97fee0a3c0
@ -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"""
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user