code: def on(self, event, handler=None, namespace=None):
          
          namespace = namespace or '/'
  
          def set_handler(handler):
              if namespace not in self.handlers:
                  self.handlers[namespace] = {}
              self.handlers[namespace][event] = handler
              return handler
  
          if handler is None:
              return set_handler
          set_handler(handler)
docs: Register an event handler.
  
          :param event: The event name. It can be any string. The event names
                        ``'connect'``, ``'message'`` and ``'disconnect'`` are
                        reserved and should not be used.
          :param handler: The function that should be invoked to handle the
                          event. When this parameter is not given, the method
                          acts as a decorator for the handler function.
          :param namespace: The Socket.IO namespace for the event. If this
                            argument is omitted the handler is associated with
                            the default namespace.
  
          Example usage::
  
              # as a decorator:
              @socket_io.on('connect', namespace='/chat')
              def connect_handler(sid, environ):
                  print('Connection request')
                  if environ['REMOTE_ADDR'] in blacklisted:
                      return False  # reject
  
              # as a method:
              def message_handler(sid, msg):
                  print('Received message: ', msg)
                  eio.send(sid, 'response')
              socket_io.on('message', namespace='/chat', message_handler)
  
          The handler function receives the ``sid`` (session ID) for the
          client as first argument. The ``'connect'`` event handler receives the
          WSGI environment as a second argument, and can return ``False`` to
          reject the connection. The ``'message'`` handler and handlers for
          custom event names receive the message payload as a second argument.
          Any values returned from a message handler will be passed to the
          client's acknowledgement callback function if it exists. The
          ``'disconnect'`` handler does not take a second argument.