1616from pydantic import BaseModel
1717
1818from taskiq .abc .middleware import TaskiqMiddleware
19- from taskiq .exceptions import SendTaskError
19+ from taskiq .exceptions import SendTaskError , SkipSendError
2020from taskiq .labels import prepare_label
2121from taskiq .message import TaskiqMessage
2222from taskiq .scheduler .created_schedule import CreatedSchedule
@@ -145,6 +145,8 @@ async def kiq(
145145 It gets current broker and calls it's kick method,
146146 returning what it returns.
147147
148+ Returns without sending if a pre_send hook raises SkipSendError.
149+
148150 :param args: function's arguments.
149151 :param kwargs: function's key word arguments.
150152
@@ -159,20 +161,26 @@ async def kiq(
159161 kwargs ,
160162 )
161163 message = self ._prepare_message (* args , ** kwargs )
162- for middleware in self .broker .middlewares :
163- if middleware .__class__ .pre_send != TaskiqMiddleware .pre_send :
164- message = await maybe_awaitable (middleware .pre_send (message ))
165164 try :
166- await self .broker .kick (self .broker .formatter .dumps (message ))
167- except Exception as exc :
168- raise SendTaskError from exc
165+ for middleware in self .broker .middlewares :
166+ if middleware .__class__ .pre_send != TaskiqMiddleware .pre_send :
167+ message = await maybe_awaitable (middleware .pre_send (message ))
168+ except SkipSendError as exc :
169+ logger .debug ("Task %s has been skipped." , self .task_name )
170+ task_id = exc .task_id or message .task_id
171+ else :
172+ try :
173+ await self .broker .kick (self .broker .formatter .dumps (message ))
174+ except Exception as exc :
175+ raise SendTaskError from exc
169176
170- for middleware in reversed (self .broker .middlewares ):
171- if middleware .__class__ .post_send != TaskiqMiddleware .post_send :
172- await maybe_awaitable (middleware .post_send (message ))
177+ for middleware in reversed (self .broker .middlewares ):
178+ if middleware .__class__ .post_send != TaskiqMiddleware .post_send :
179+ await maybe_awaitable (middleware .post_send (message ))
180+ task_id = message .task_id
173181
174182 return AsyncTaskiqTask (
175- task_id = message . task_id ,
183+ task_id = task_id ,
176184 result_backend = self .broker .result_backend ,
177185 return_type = self .return_type , # type: ignore # (pyright issue)
178186 )
0 commit comments