code: async def notify(self, *args):
          
          from .filters import check_filters, FilterNotPassed
  
          results = []
  
          data = {}
          ctx_data.set(data)
  
          if self.middleware_key:
              try:
                  await self.dispatcher.middleware.trigger(f"pre_process_{self.middleware_key}", args + (data,))
              except CancelHandler:  # Allow to cancel current event
                  return results
  
          try:
              for handler_obj in self.handlers:
                  try:
                      data.update(await check_filters(handler_obj.filters, args))
                  except FilterNotPassed:
                      continue
                  else:
                      ctx_token = current_handler.set(handler_obj.handler)
                      try:
                          if self.middleware_key:
                              await self.dispatcher.middleware.trigger(f"process_{self.middleware_key}", args + (data,))
                          partial_data = _check_spec(handler_obj.spec, data)
                          response = await handler_obj.handler(*args, **partial_data)
                          if response is not None:
                              results.append(response)
                          if self.once:
                              break
                      except SkipHandler:
                          continue
                      except CancelHandler:
                          break
                      finally:
                          current_handler.reset(ctx_token)
          finally:
              if self.middleware_key:
                  await self.dispatcher.middleware.trigger(f"post_process_{self.middleware_key}",
                                                           args + (results, data,))
  
          return results
docs: Notify handlers
  
          :param args:
          :return: