From 1b0f71a39b80c49f0fcbb9a41b54b5dfaff0c175 Mon Sep 17 00:00:00 2001 From: Marcin Bachry Date: Thu, 8 Jan 2026 23:27:03 +0100 Subject: [PATCH] Fix BadSignature after the default Django cache expires (#311) * async_iter: fix BadSignature after the default Django cache expires * lint --- django_q/tasks.py | 4 +++- django_q/tests/test_cached.py | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/django_q/tasks.py b/django_q/tasks.py index b1cedcb..e235f06 100644 --- a/django_q/tasks.py +++ b/django_q/tasks.py @@ -461,7 +461,9 @@ def async_iter(func, args_iter, **kwargs): # save the original arguments broker = options["broker"] broker.cache.set( - f"{broker.list_key}:{iter_group}:args", SignedPackage.dumps(args_iter) + f"{broker.list_key}:{iter_group}:args", + SignedPackage.dumps(args_iter), + timeout=None, ) for args in args_iter: if not isinstance(args, tuple): diff --git a/django_q/tests/test_cached.py b/django_q/tests/test_cached.py index 092a7ee..08a8bb6 100644 --- a/django_q/tests/test_cached.py +++ b/django_q/tests/test_cached.py @@ -1,3 +1,5 @@ +import time +from copy import deepcopy from multiprocessing import Event, Value import pytest @@ -128,6 +130,27 @@ def test_iter(broker): assert len(i.result()) == 5 +def _sleeping_func(_): + time.sleep(1) + + +@pytest.mark.django_db +def test_iter_default_cache_timeout(broker, settings): + """ + Test async_iter when it completes after the default Django + cache timeout expires. + """ + cache_settings = deepcopy(settings.CACHES) + cache_settings["default"]["TIMEOUT"] = 1 + settings.CACHES = cache_settings + broker.purge_queue() + broker.cache.clear() + it = [i for i in range(2)] + t = async_iter(_sleeping_func, it, sync=True) + result_t = result(t) + assert result_t is not None + + @pytest.mark.django_db def test_chain(broker): broker.purge_queue()