summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVaĊĦek Dohnal <vaclav.dohnal@gmail.com>2024-02-08 09:21:03 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2024-02-08 12:56:41 +0100
commit761e913191bf9c3705991c92d329a9f23d710b9f (patch)
treebfc466ee31e156d13523dd5de77fb78b6eb19cf0
parentc22075af803e031e2977ed93391c2e3c6a714df4 (diff)
[5.0.x] Fixed #35174 -- Fixed Signal.asend()/asend_robust() crash when all receivers are asynchronous.
Regression in e83a88566a71a2353cebc35992c110be0f8628af. Backport of 1b5338d03ecc962af8ab4678426bc60b0672b8dd from main
-rw-r--r--django/dispatch/dispatcher.py8
-rw-r--r--docs/releases/5.0.3.txt4
-rw-r--r--tests/signals/tests.py16
3 files changed, 26 insertions, 2 deletions
diff --git a/django/dispatch/dispatcher.py b/django/dispatch/dispatcher.py
index 26ef09ce49..fe0e1fa599 100644
--- a/django/dispatch/dispatcher.py
+++ b/django/dispatch/dispatcher.py
@@ -244,7 +244,9 @@ class Signal:
return responses
else:
- sync_send = list
+
+ async def sync_send():
+ return []
responses, async_responses = await asyncio.gather(
sync_send(),
@@ -380,7 +382,9 @@ class Signal:
return responses
else:
- sync_send = list
+
+ async def sync_send():
+ return []
async def asend_and_wrap_exception(receiver):
try:
diff --git a/docs/releases/5.0.3.txt b/docs/releases/5.0.3.txt
index 384ce27fb7..30e87127b0 100644
--- a/docs/releases/5.0.3.txt
+++ b/docs/releases/5.0.3.txt
@@ -11,3 +11,7 @@ Bugfixes
* Fixed a regression in Django 5.0.2 where ``intcomma`` template filter could
return a leading comma for string representation of floats (:ticket:`35172`).
+
+* Fixed a bug in Django 5.0 that caused a crash of ``Signal.asend()`` and
+ ``asend_robust()`` when all receivers were asynchronous functions
+ (:ticket:`35174`).
diff --git a/tests/signals/tests.py b/tests/signals/tests.py
index 5558778bbe..6c90c6aa52 100644
--- a/tests/signals/tests.py
+++ b/tests/signals/tests.py
@@ -626,3 +626,19 @@ class AsyncReceiversTests(SimpleTestCase):
(async_handler, 1),
],
)
+
+ async def test_asend_only_async_receivers(self):
+ async_handler = AsyncHandler()
+ signal = dispatch.Signal()
+ signal.connect(async_handler)
+
+ result = await signal.asend(self.__class__)
+ self.assertEqual(result, [(async_handler, 1)])
+
+ async def test_asend_robust_only_async_receivers(self):
+ async_handler = AsyncHandler()
+ signal = dispatch.Signal()
+ signal.connect(async_handler)
+
+ result = await signal.asend_robust(self.__class__)
+ self.assertEqual(result, [(async_handler, 1)])