jammy (1) flask-socketio.1.gz

Provided by: python3-flask-socketio_5.0.1-1_all bug

NAME

       flask-socketio - Flask-SocketIO Documentation

       Flask-SocketIO  gives  Flask applications access to low latency bi-directional communications between the
       clients and the server. The client-side  application  can  use  any  of  the  SocketIO  official  clients
       libraries  in  Javascript,  C++,  Java  and  Swift,  or  any  compatible  client to establish a permanent
       connection to the server.

INSTALLATION

       You can install this package in the usual way using pip:

          pip install flask-socketio

REQUIREMENTS

       Flask-SocketIO is compatible with Python 3.6+. The asynchronous services that this package relies on  can
       be selected among three choices:

       • eventlet is the best performant option, with support for long-polling and WebSocket transports.

       • gevent  is  supported  in  a  number  of  different configurations. The long-polling transport is fully
         supported with the gevent package, but unlike eventlet, gevent does not have native WebSocket  support.
         To  add support for WebSocket there are currently two options.  Installing the gevent-websocket package
         adds WebSocket support to gevent or one can use the  uWSGI  web  server,  which  comes  with  WebSocket
         functionality. The use of gevent is also a performant option, but slightly lower than eventlet.

       • The  Flask  development server based on Werkzeug can be used as well, with the caveat that it lacks the
         performance of the other two options, so it should only be used to simplify the  development  workflow.
         This option only supports the long-polling transport.

       The  extension  automatically  detects  which  asynchronous  framework to use based on what is installed.
       Preference is given to eventlet,  followed  by  gevent.   For  WebSocket  support  in  gevent,  uWSGI  is
       preferred,  followed  by  gevent-websocket.  If neither eventlet nor gevent are installed, then the Flask
       development server is used.

       If using multiple processes, a message queue service is used by the processes  to  coordinate  operations
       such  as  broadcasting.  The  supported  queues  are Redis, RabbitMQ, Kafka, and any other message queues
       supported by the Kombu package.

       On the client-side, the official  Socket.IO  Javascript  client  library  can  be  used  to  establish  a
       connection  to  the  server.  There  are also official clients written in Swift, Java and C++. Unofficial
       clients may also work, as long as they implement the Socket.IO  protocol.   The  python-socketio  package
       includes a Python client.

VERSION COMPATIBILITY

       The  Socket.IO  protocol  has  been  through a number of revisions, and some of these introduced backward
       incompatible changes, which means that the client  and  the  server  must  use  compatible  versions  for
       everything to work.

       The  version  compatibility  chart  below  maps  versions  of  this package to versions of the JavaScript
       reference implementation and the versions of the Socket.IO and Engine.IO protocols.

              ┌────────────┬───────────┬───────────┬────────────────┬─────────────────┬─────────────────┐
              │JavaScript  │ Socket.IO │ Engine.IO │ Flask-SocketIO │ python-socketio │ python-engineio │
              │Socket.IO   │ protocol  │ protocol  │ version        │ version         │ version         │
              │version     │ revision  │ revision  │                │                 │                 │
              ├────────────┼───────────┼───────────┼────────────────┼─────────────────┼─────────────────┤
              │0.9.x       │ 1, 2      │ 1, 2      │ Not supported  │ Not supported   │ Not supported   │
              ├────────────┼───────────┼───────────┼────────────────┼─────────────────┼─────────────────┤
              │1.x and 2.x │ 3, 4      │ 3         │ 4.x            │ 4.x             │ 3.x             │
              └────────────┴───────────┴───────────┴────────────────┴─────────────────┴─────────────────┘

              │3.x         │ 5         │ 4         │ 5.x            │ 5.x             │ 4.x             │
              └────────────┴───────────┴───────────┴────────────────┴─────────────────┴─────────────────┘

INITIALIZATION

       The following code example shows how to add Flask-SocketIO to a Flask application:

          from flask import Flask, render_template
          from flask_socketio import SocketIO

          app = Flask(__name__)
          app.config['SECRET_KEY'] = 'secret!'
          socketio = SocketIO(app)

          if __name__ == '__main__':
              socketio.run(app)

       The  init_app()  style  of  initialization is also supported. To start the web server simply execute your
       script. Note the way the web server is started.  The socketio.run() function encapsulates the start up of
       the  web  server  and  replaces  the  app.run()  standard  Flask  development  server  start up. When the
       application is in debug mode the Werkzeug development server is still used and configured properly inside
       socketio.run().  In  production  mode  the  eventlet web server is used if available, else the gevent web
       server is used. If eventlet and gevent are not installed, the Werkzeug development web server is used.

       The flask run command introduced in Flask 0.11 can be used to start a Flask-SocketIO  development  server
       based  on  Werkzeug, but this method of starting the Flask-SocketIO server is not recommended due to lack
       of WebSocket support.  Previous versions of this package included a customized version of the  flask  run
       command  that  allowed  the  use  of  WebSocket  on  eventlet  and  gevent  production  servers, but this
       functionality has been discontinued in favor of the socketio.run(app) startup method shown above which is
       more robust.

       The  application  must  serve  a  page  to  the client that loads the Socket.IO library and establishes a
       connection:

          <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
          <script type="text/javascript" charset="utf-8">
              var socket = io();
              socket.on('connect', function() {
                  socket.emit('my event', {data: 'I\'m connected!'});
              });
          </script>

RECEIVING MESSAGES

       When using SocketIO, messages are received by both parties as  events.  On  the  client  side  Javascript
       callbacks are used. With Flask-SocketIO the server needs to register handlers for these events, similarly
       to how routes are handled by view functions.

       The following example creates a server-side event handler for an unnamed event:

          @socketio.on('message')
          def handle_message(data):
              print('received message: ' + data)

       The above example uses string messages. Another type of unnamed events use JSON data:

          @socketio.on('json')
          def handle_json(json):
              print('received json: ' + str(json))

       The most flexible type of event uses custom event names. The message data for these events can be string,
       bytes, int, or JSON:

          @socketio.on('my event')
          def handle_my_custom_event(json):
              print('received json: ' + str(json))

       Custom named events can also support multiple arguments:

          @socketio.on('my_event')
          def handle_my_custom_event(arg1, arg2, arg3):
              print('received args: ' + arg1 + arg2 + arg3)

       When the name of the event is a valid Python identifier that does not collide with other defined symbols,
       the @socketio.event provides a more compact syntax that takes the event name from the decorated function:

          @socketio.event
          def my_custom_event(arg1, arg2, arg3):
              print('received args: ' + arg1 + arg2 + arg3)

       Named events are the most flexible, as they eliminate the need to include additional metadata to describe
       the  message  type.  The  names message, json, connect and disconnect are reserved and cannot be used for
       named events.

       Flask-SocketIO also supports SocketIO namespaces, which allow the client to multiplex several independent
       connections on the same physical socket:

          @socketio.on('my event', namespace='/test')
          def handle_my_custom_namespace_event(json):
              print('received json: ' + str(json))

       When a namespace is not specified a default global namespace with the name '/' is used.

       For cases when a decorator syntax isn't convenient, the on_event method can be used:

          def my_function_handler(data):
              pass

          socketio.on_event('my event', my_function_handler, namespace='/test')

       Clients  may request an acknowledgement callback that confirms receipt of a message they sent. Any values
       returned from the handler function will be passed to the client as arguments in the callback function:

          @socketio.on('my event')
          def handle_my_custom_event(json):
              print('received json: ' + str(json))
              return 'one', 2

       In the above example, the client callback function will be invoked with two arguments, 'one' and 2. If  a
       handler  function  does  not  return  any  values,  the  client callback function will be invoked without
       arguments.

SENDING MESSAGES

       SocketIO event handlers defined as shown in the previous section can send reply messages to the connected
       client using the send() and emit() functions.

       The following examples bounce received events back to the client that sent them:

          from flask_socketio import send, emit

          @socketio.on('message')
          def handle_message(message):
              send(message)

          @socketio.on('json')
          def handle_json(json):
              send(json, json=True)

          @socketio.on('my event')
          def handle_my_custom_event(json):
              emit('my response', json)

       Note how send() and emit() are used for unnamed and named events respectively.

       When  working  with namespaces, send() and emit() use the namespace of the incoming message by default. A
       different namespace can be specified with the optional namespace argument:

          @socketio.on('message')
          def handle_message(message):
              send(message, namespace='/chat')

          @socketio.on('my event')
          def handle_my_custom_event(json):
              emit('my response', json, namespace='/chat')

       To send an event with multiple arguments, send a tuple:

          @socketio.on('my event')
          def handle_my_custom_event(json):
              emit('my response', ('foo', 'bar', json), namespace='/chat')

       SocketIO supports acknowledgment callbacks that confirm that a message was received by the client:

          def ack():
              print 'message was received!'

          @socketio.on('my event')
          def handle_my_custom_event(json):
              emit('my response', json, callback=ack)

       When using callbacks, the Javascript client receives a callback function to invoke upon  receipt  of  the
       message.  After the client application invokes the callback function the server invokes the corresponding
       server-side callback.  If the client-side callback is invoked  with  arguments,  these  are  provided  as
       arguments to the server-side callback as well.

BROADCASTING

       Another  very  useful  feature of SocketIO is the broadcasting of messages.  Flask-SocketIO supports this
       feature with the broadcast=True optional argument to send() and emit():

          @socketio.on('my event')
          def handle_my_custom_event(data):
              emit('my response', data, broadcast=True)

       When a message is sent with the broadcast option enabled, all clients connected to the namespace  receive
       it,  including  the  sender.  When namespaces are not used, the clients connected to the global namespace
       receive the message. Note that callbacks are not invoked for broadcast messages.

       In all the examples shown until this point the server responds to an event sent by the  client.  But  for
       some  applications,  the  server  needs  to  be  the  originator of a message. This can be useful to send
       notifications to clients of events that originated in the server, for example  in  a  background  thread.
       The socketio.send() and socketio.emit() methods can be used to broadcast to all connected clients:

          def some_function():
              socketio.emit('some event', {'data': 42})

       Note  that socketio.send() and socketio.emit() are not the same functions as the context-aware send() and
       emit(). Also note that in the above usage there is no client context, so broadcast=True  is  assumed  and
       does not need to be specified.

ROOMS

       For  many  applications  it  is necessary to group users into subsets that can be addressed together. The
       best example is a chat application with multiple rooms, where users receive messages  from  the  room  or
       rooms  they  are in, but not from other rooms where other users are. Flask-SocketIO supports this concept
       of rooms through the join_room() and leave_room() functions:

          from flask_socketio import join_room, leave_room

          @socketio.on('join')
          def on_join(data):
              username = data['username']
              room = data['room']
              join_room(room)
              send(username + ' has entered the room.', room=room)

          @socketio.on('leave')
          def on_leave(data):
              username = data['username']
              room = data['room']
              leave_room(room)
              send(username + ' has left the room.', room=room)

       The send() and emit() functions accept an optional room argument that cause the message to be sent to all
       the clients that are in the given room.

       All clients are assigned a room when they connect, named with the session ID of the connection, which can
       be obtained from request.sid. A given client can join any rooms, which can be given  any  names.  When  a
       client  disconnects  it  is  removed  from  all the rooms it was in. The context-free socketio.send() and
       socketio.emit() functions also accept a room argument to broadcast to all clients in a room.

       Since all clients are assigned a personal room, to address a message to a single client, the  session  ID
       of the client can be used as the room argument.

CONNECTION EVENTS

       Flask-SocketIO  also  dispatches  connection and disconnection events. The following example shows how to
       register handlers for them:

          @socketio.on('connect')
          def test_connect():
              emit('my response', {'data': 'Connected'})

          @socketio.on('disconnect')
          def test_disconnect():
              print('Client disconnected')

       The connection event  handler  can  return  False  to  reject  the  connection,  or  it  can  also  raise
       ConectionRefusedError.  This  is  so  that  the client can be authenticated at this point. When using the
       exception, any arguments passed to the exception  are  returned  to  the  client  in  the  error  packet.
       Examples:

          from flask_socketio import ConnectionRefusedError

          @socketio.on('connect')
          def connect():
              if not self.authenticate(request.args):
                  raise ConnectionRefusedError('unauthorized!')

       Note that connection and disconnection events are sent individually on each namespace used.

CLASS-BASED NAMESPACES

       As  an  alternative to the decorator-based event handlers described above, the event handlers that belong
       to a namespace can be created as methods of a class. The flask_socketio.Namespace is provided as  a  base
       class to create class-based namespaces:

          from flask_socketio import Namespace, emit

          class MyCustomNamespace(Namespace):
              def on_connect(self):
                  pass

              def on_disconnect(self):
                  pass

              def on_my_event(self, data):
                  emit('my_response', data)

          socketio.on_namespace(MyCustomNamespace('/test'))

       When  class-based namespaces are used, any events received by the server are dispatched to a method named
       as the event name with the on_ prefix. For example, event my_event will be  handled  by  a  method  named
       on_my_event.  If an event is received for which there is no corresponding method defined in the namespace
       class, then the event is ignored. All event names used in class-based namespaces must use characters that
       are legal in method names.

       As  a convenience to methods defined in a class-based namespace, the namespace instance includes versions
       of several of the methods in the flask_socketio.SocketIO class that default to the proper namespace  when
       the namespace argument is not given.

       If  an  event has a handler in a class-based namespace, and also a decorator-based function handler, only
       the decorated function handler is invoked.

ERROR HANDLING

       Flask-SocketIO can also deal with exceptions:

          @socketio.on_error()        # Handles the default namespace
          def error_handler(e):
              pass

          @socketio.on_error('/chat') # handles the '/chat' namespace
          def error_handler_chat(e):
              pass

          @socketio.on_error_default  # handles all namespaces without an explicit error handler
          def default_error_handler(e):
              pass

       Error handler functions take the exception object as an argument.

       The message and data arguments of the current request  can  also  be  inspected  with  the  request.event
       variable, which is useful for error logging and debugging outside the event handler:

          from flask import request

          @socketio.on("my error event")
          def on_my_event(data):
              raise RuntimeError()

          @socketio.on_error_default
          def default_error_handler(e):
              print(request.event["message"]) # "my error event"
              print(request.event["args"])    # (data,)

DEBUGGING AND TROUBLESHOOTING

       To help you debug issues, the server can be configured to output logs to the terminal:

          socketio = SocketIO(logger=True, engineio_logger=True)

       The  logger  argument  controls logging related to the Socket.IO protocol, while engineio_logger controls
       logs that originate in the low-level Engine.IO transport. These arguments can be set to  True  to  output
       logs to stderr, or to an object compatible with Python's logging package where the logs should be emitted
       to. A value of False disables logging.

       Logging can help identify the cause of connection problems, 400  responses,  bad  performance  and  other
       issues.

ACCESS TO FLASK'S CONTEXT GLOBALS

       Handlers  for  SocketIO  events  are  different  than  handlers  for  routes and that introduces a lot of
       confusion around what can and cannot be done in a SocketIO handler. The main difference is that  all  the
       SocketIO events generated for a client occur in the context of a single long running request.

       In  spite of the differences, Flask-SocketIO attempts to make working with SocketIO event handlers easier
       by making the environment similar to that of a regular HTTP request. The following  list  describes  what
       works and what doesn't:

       • An application context is pushed before invoking an event handler making current_app and g available to
         the handler.

       • A request context is also pushed before invoking a handler, also making request and session  available.
         But  note  that  WebSocket  events do not have individual requests associated with them, so the request
         context that started the connection is pushed for all the events that are dispatched during the life of
         the connection.

       • The  request  context  global  is enhanced with a sid member that is set to a unique session ID for the
         connection. This value is used as an initial room where the client is added.

       • The request context global is enhanced with namespace and event  members  that  contain  the  currently
         handled namespace and event arguments.  The event member is a dictionary with message and args keys.

       • The  session  context  global  behaves  in a different way than in regular requests. A copy of the user
         session at the time the SocketIO connection is established is made available to handlers invoked in the
         context  of  that  connection. If a SocketIO handler modifies the session, the modified session will be
         preserved for future SocketIO handlers, but regular HTTP route handlers will  not  see  these  changes.
         Effectively,  when  a  SocketIO  handler  modifies  the  session,  a  "fork"  of the session is created
         exclusively for these handlers. The technical reason for this limitation  is  that  to  save  the  user
         session  a cookie needs to be sent to the client, and that requires HTTP request and response, which do
         not exist in a SocketIO connection. When using server-side sessions  such  as  those  provided  by  the
         Flask-Session  or Flask-KVSession extensions, changes made to the session in HTTP route handlers can be
         seen by SocketIO handlers, as long as the session is not modified in the SocketIO handlers.

       • The before_request and after_request hooks are not invoked for SocketIO event handlers.

       • SocketIO handlers can take custom decorators, but most Flask decorators will not be appropriate to  use
         for  a  SocketIO  handler,  given  that  there  is  no  concept  of a Response object during a SocketIO
         connection.

AUTHENTICATION

       A common need of applications is to validate the identity of  their  users.  The  traditional  mechanisms
       based  on web forms and HTTP requests cannot be used in a SocketIO connection, since there is no place to
       send HTTP requests and responses. If necessary, an application can implement a customized login form that
       sends credentials to the server as a SocketIO message when the submit button is pressed by the user.

       However, in most cases it is more convenient to perform the traditional authentication process before the
       SocketIO connection is established. The user's identity can then be recorded in the user session or in  a
       cookie,  and  later  when  the  SocketIO connection is established that information will be accessible to
       SocketIO event handlers.

   Using Flask-Login with Flask-SocketIO
       Flask-SocketIO can access login information  maintained  by  Flask-Login.  After  a  regular  Flask-Login
       authentication  is  performed  and  the  login_user()  function  is called to record the user in the user
       session, any SocketIO connections will have access to the current_user context variable:

          @socketio.on('connect')
          def connect_handler():
              if current_user.is_authenticated:
                  emit('my response',
                       {'message': '{0} has joined'.format(current_user.name)},
                       broadcast=True)
              else:
                  return False  # not allowed here

       Note that the login_required decorator cannot  be  used  with  SocketIO  event  handlers,  but  a  custom
       decorator that disconnects non-authenticated users can be created as follows:

          import functools
          from flask import request
          from flask_login import current_user
          from flask_socketio import disconnect, emit

          def authenticated_only(f):
              @functools.wraps(f)
              def wrapped(*args, **kwargs):
                  if not current_user.is_authenticated:
                      disconnect()
                  else:
                      return f(*args, **kwargs)
              return wrapped

          @socketio.on('my event')
          @authenticated_only
          def handle_my_custom_event(data):
              emit('my response', {'message': '{0} has joined'.format(current_user.name)},
                   broadcast=True)

DEPLOYMENT

       There are many options to deploy a Flask-SocketIO server, ranging from simple to the insanely complex. In
       this section, the most commonly used options are described.

   Embedded Server
       The simplest deployment strategy is to have eventlet or gevent installed, and start  the  web  server  by
       calling  socketio.run(app)  as  shown in examples above. This will run the application on the eventlet or
       gevent web servers, whichever is installed.

       Note that socketio.run(app) runs a production ready server when eventlet  or  gevent  are  installed.  If
       neither of these are installed, then the application runs on Flask's development web server, which is not
       appropriate for production use.

       Unfortunately this option is not available when using gevent with uWSGI. See the uWSGI section below  for
       information on this option.

   Gunicorn Web Server
       An  alternative  to  socketio.run(app)  is  to  use  gunicorn as web server, using the eventlet or gevent
       workers. For this option, eventlet or gevent need to be installed, in addition to gunicorn.  The  command
       line that starts the eventlet server via gunicorn is:

          gunicorn --worker-class eventlet -w 1 module:app

       If you prefer to use gevent, the command to start the server is:

          gunicorn -k gevent -w 1 module:app

       When  using  gunicorn  with the gevent worker and the WebSocket support provided by gevent-websocket, the
       command that starts the server must be changed to select a custom gevent web  server  that  supports  the
       WebSocket protocol. The modified command is:

          gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 module:app

       In  all these commands, module is the Python module or package that defines the application instance, and
       app is the application instance itself.

       Due to the limited load balancing algorithm used by gunicorn, it is not possible to  use  more  than  one
       worker  process  when  using  this  web  server. For that reason, all the examples above include the -w 1
       option.

   uWSGI Web Server
       When using the uWSGI server in combination with gevent,  the  Socket.IO  server  can  take  advantage  of
       uWSGI’s native WebSocket support.

       A  complete  explanation  of  the configuration and usage of the uWSGI server is beyond the scope of this
       documentation. The uWSGI server is a fairly complex package that provides a large and  comprehensive  set
       of  options.  It  must  be  compiled  with  WebSocket  and  SSL support for the WebSocket transport to be
       available. As way of an introduction, the following  command  starts  a  uWSGI  server  for  the  example
       application app.py on port 5000:

          $ uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app

   Using nginx as a WebSocket Reverse Proxy
       It  is  possible  to  use  nginx  as  a  front-end reverse proxy that passes requests to the application.
       However, only releases of nginx 1.4 and newer support proxying of the  WebSocket  protocol.  Below  is  a
       basic nginx configuration that proxies HTTP and WebSocket requests:

          server {
              listen 80;
              server_name _;

              location / {
                  include proxy_params;
                  proxy_pass http://127.0.0.1:5000;
              }

              location /static {
                  alias <path-to-your-application>/static;
                  expires 30d;
              }

              location /socket.io {
                  include proxy_params;
                  proxy_http_version 1.1;
                  proxy_buffering off;
                  proxy_set_header Upgrade $http_upgrade;
                  proxy_set_header Connection "Upgrade";
                  proxy_pass http://127.0.0.1:5000/socket.io;
              }
          }

       The next example adds the support for load balancing multiple Socket.IO servers:

          upstream socketio_nodes {
              ip_hash;

              server 127.0.0.1:5000;
              server 127.0.0.1:5001;
              server 127.0.0.1:5002;
              # to scale the app, just add more nodes here!
          }

          server {
              listen 80;
              server_name _;

              location / {
                  include proxy_params;
                  proxy_pass http://127.0.0.1:5000;
              }

              locaton /static {
                  alias <path-to-your-application>/static;
                  expires 30d;
              }

              location /socket.io {
                  include proxy_params;
                  proxy_http_version 1.1;
                  proxy_buffering off;
                  proxy_set_header Upgrade $http_upgrade;
                  proxy_set_header Connection "Upgrade";
                  proxy_pass http://socketio_nodes/socket.io;
              }
          }

       While  the  above  examples  can  work as an initial configuration, be aware that a production install of
       nginx will need a more complete configuration covering other deployment aspects such  as  serving  static
       file assets and SSL support.

   Using Multiple Workers
       Flask-SocketIO  supports  multiple  workers  behind  a load balancer starting with release 2.0. Deploying
       multiple workers gives applications that use Flask-SocketIO the ability to spread the client  connections
       among  multiple  processes  and  hosts, and in this way scale to support very large numbers of concurrent
       clients.

       There are two requirements to use multiple Flask-SocketIO workers:

       • The load balancer must be configured to forward all HTTP requests from a given  client  always  to  the
         same worker. This is sometimes referenced as "sticky sessions". For nginx, use the ip_hash directive to
         achieve this.  Gunicorn cannot be used with multiple workers because its load balancer  algorithm  does
         not support sticky sessions.

       • Since  each  of the servers owns only a subset of the client connections, a message queue such as Redis
         or RabbitMQ is used by the servers to coordinate complex operations such as broadcasting and rooms.

       When working with a message queue, there are additional dependencies that need to be installed:

       • For Redis, the package redis must be installed (pip install redis).

       • For RabbitMQ, the package kombu must be installed (pip install kombu).

       • For Kafka, the package kafka-python must be installed (pip install kafka-python).

       • For other message queues supported by Kombu, see the Kombu documentation to find out what  dependencies
         are needed.

       • If  eventlet  or gevent are used, then monkey patching the Python standard library is normally required
         to force the message queue package to use coroutine friendly functions and classes.

       For eventlet, monkey patching is done with:

          import eventlet
          eventlet.monkey_patch()

       For gevent, you can monkey patch the standard library with:

          from gevent import monkey
          monkey.patch_all()

       In both cases it is recommended that you apply the monkey patching at the top of your main  script,  even
       above your imports.

       To  start  multiple  Flask-SocketIO  servers,  you  must  first ensure you have the message queue service
       running. To start a Socket.IO server and have it connect to the  message  queue,  add  the  message_queue
       argument to the SocketIO constructor:

          socketio = SocketIO(app, message_queue='redis://')

       The  value  of  the message_queue argument is the connection URL of the queue service that is used. For a
       redis queue running on the same host as the server, the 'redis://' URL  can  be  used.  Likewise,  for  a
       default  RabbitMQ  queue the 'amqp://' URL can be used. For Kafka, use a kafka:// URL.  The Kombu package
       has a documentation section that describes the format of the URLs for all the supported queues.

   Emitting from an External Process
       For many types of applications, it is necessary to emit events from a process that is  not  the  SocketIO
       server,  for  an example a Celery worker. If the SocketIO server or servers are configured to listen on a
       message queue as shown in the previous section, then any  other  process  can  create  its  own  SocketIO
       instance and use it to emit events in the same way the server does.

       For  example,  for an application that runs on an eventlet web server and uses a Redis message queue, the
       following Python script broadcasts an event to all clients:

          socketio = SocketIO(message_queue='redis://')
          socketio.emit('my event', {'data': 'foo'}, namespace='/test')

       When using the SocketIO instance in this way, the  Flask  application  instance  is  not  passed  to  the
       constructor.

       The  channel  argument  to SocketIO can be used to select a specific channel of communication through the
       message queue. Using a custom channel name is necessary when  there  are  multiple  independent  SocketIO
       services sharing the same queue.

       Flask-SocketIO  does  not apply monkey patching when eventlet or gevent are used. But when working with a
       message queue, it is very likely that the Python package that talks to the  message  queue  service  will
       hang if the Python standard library is not monkey patched.

       It is important to note that an external process that wants to connect to a SocketIO server does not need
       to use eventlet or gevent like the main server. Having a server  use  a  coroutine  framework,  while  an
       external  process  is  not  a  problem.  For  example, Celery workers do not need to be configured to use
       eventlet or gevent just because the main server does. But if your external process does use  a  coroutine
       framework  for  whatever  reason,  then  monkey  patching  is  likely required, so that the message queue
       accesses coroutine friendly functions and classes.

CROSS-ORIGIN CONTROLS

       For security reasons, this server enforces a same-origin policy by  default.  In  practical  terms,  this
       means the following:

       • If  an incoming HTTP or WebSocket request includes the Origin header, this header must match the scheme
         and host of the connection URL. In case of a mismatch, a 400 status code response is returned  and  the
         connection is rejected.

       • No restrictions are imposed on incoming requests that do not include the Origin header.

       If  necessary,  the  cors_allowed_origins option can be used to allow other origins. This argument can be
       set to a string to set a single allowed origin, or to a list to allow multiple origins. A  special  value
       of  '*'  can  be  used to instruct the server to allow all origins, but this should be done with care, as
       this could make the server vulnerable to Cross-Site Request Forgery (CSRF) attacks.

   Upgrading to Flask-SocketIO 5.x from the 4.x releases
       The Socket.IO protocol recently introduced a series of backwards incompatible changes. The  5.x  releases
       of  Flask-SocketIO  adopted these changes, and for that reason it can only be used with clients that have
       also been updated to the current version of the protocol. In particular, this means that  the  JavaScript
       client  must  be upgraded to a 3.x release, and if your client hasn't been upgraded to the latest version
       of the Socket.IO protocol, then you must use a Flask-SocketIO 4.x release.

       The following protocol changes are of importance, as they may affect existing applications:

       • The default namespace '/' is not automatically connected anymore, and is now treated in the same way as
         other namespaces.

       • Each  namespace  connection  has  its  own  sid value, different from the others and different from the
         Engine.IO sid.

       • Flask-SocketIO now uses the  same  ping  interval  and  timeout  values  as  the  JavaScript  reference
         implementation, which are 25 and 5 seconds respectively.

       • The  ping/pong mechanism has been reversed. In the current version of the protocol, the server issues a
         ping and the client responds with a pong.

       • The default allowed payload size for long--polling packets has been lowered from 100MB to 1MB.

       • The io cookie is not sent to the client anymore by default.

API REFERENCE

       class flask_socketio.SocketIO(app=None, **kwargs)
              Create a Flask-SocketIO server.

              Parametersapp -- The flask application instance. If the application instance  isn't  known  at  the
                       time  this  class  is instantiated, then call socketio.init_app(app) once the application
                       instance is available.

                     • manage_session -- If set to True, this extension manages the user session  for  Socket.IO
                       events.  If  set  to  False,  Flask's  own session management is used. When using Flask's
                       cookie based sessions it is recommended that you leave this set to the default  of  True.
                       When using server-side sessions, a False setting enables sharing the user session between
                       HTTP routes and Socket.IO events.

                     • message_queue -- A connection URL for a message queue service  the  server  can  use  for
                       multi-process  communication.  A message queue is not required when using a single server
                       process.

                     • channel -- The channel name, when using a message queue. If a channel isn't specified,  a
                       default  channel will be used. If multiple clusters of SocketIO processes need to use the
                       same message queue without interfering with each other, then each cluster  should  use  a
                       different channel.

                     • path  --  The  path where the Socket.IO server is exposed. Defaults to 'socket.io'. Leave
                       this as is unless you know what you are doing.

                     • resource -- Alias to path.

                     • kwargs -- Socket.IO and Engine.IO server options.

              The Socket.IO server options are detailed below:

              Parametersclient_manager -- The client manager instance that will manage the client list. When this
                       is  omitted,  the client list is stored in an in-memory structure, so the use of multiple
                       connected servers is not possible. In most cases, this argument does not need to  be  set
                       explicitly.

                     • logger  --  To  enable  logging  set  to  True or pass a logger object to use. To disable
                       logging set to False. The default is False. Note that fatal errors will  be  logged  even
                       when logger is False.

                     • json  -- An alternative json module to use for encoding and decoding packets. Custom json
                       modules must have dumps and loads functions that are compatible with the standard library
                       versions.  To  use  the  same  json  encoder  and  decoder  as  a  Flask application, use
                       flask.json.

                     • async_handlers -- If set to True, event handlers for a client are  executed  in  separate
                       threads. To run handlers for a client synchronously, set to False. The default is True.

                     • always_connect  --  When  set  to  False, new connections are provisory until the connect
                       handler returns something other than False, at which point they are accepted. When set to
                       True, connections are immediately accepted, and then if the connect handler returns False
                       a disconnect is issued.  Set to True if you need to emit events from the connect  handler
                       and your client is confused when it receives events before the connection acceptance.  In
                       any other case use the default of False.

              The Engine.IO server configuration supports the following settings:

              Parametersasync_mode --  The  asynchronous  model  to  use.  See  the  Deployment  section  in  the
                       documentation  for  a  description  of  the  available  options.  Valid  async  modes are
                       threading, eventlet, gevent and gevent_uwsgi. If this argument is not given, eventlet  is
                       tried  first, then gevent_uwsgi, then gevent, and finally threading. The first async mode
                       that has all its dependencies installed is then one that is chosen.

                     • ping_interval -- The interval in seconds at  which  the  server  pings  the  client.  The
                       default  is 25 seconds. For advanced control, a two element tuple can be given, where the
                       first number is the ping interval and the second is a grace period added by the server.

                     • ping_timeout -- The time in seconds that the client  waits  for  the  server  to  respond
                       before disconnecting. The default is 5 seconds.

                     • max_http_buffer_size  --  The maximum size of a message when using the polling transport.
                       The default is 1,000,000 bytes.

                     • allow_upgrades -- Whether to allow transport upgrades or not. The default is True.

                     • http_compression -- Whether to compress packages when using the  polling  transport.  The
                       default is True.

                     • compression_threshold -- Only compress messages when their byte size is greater than this
                       value. The default is 1024 bytes.

                     • cookie -- If set to a string, it is the name of the HTTP cookie the server sends back tot
                       he  client  containing  the  client  session  id.  If set to a dictionary, the 'name' key
                       contains the cookie name and other keys define cookie attributes, where the value of each
                       attribute  can  be  a  string, a callable with no arguments, or a boolean. If set to None
                       (the default), a cookie is not sent to the client.

                     • cors_allowed_origins -- Origin or list of origins that are allowed  to  connect  to  this
                       server. Only the same origin is allowed by default. Set this argument to '*' to allow all
                       origins, or to [] to disable CORS handling.

                     • cors_credentials -- Whether credentials (cookies, authentication) are allowed in requests
                       to this server. The default is True.

                     • monitor_clients  --  If  set  to True, a background task will ensure inactive clients are
                       closed. Set to False to disable the monitoring task (not  recommended).  The  default  is
                       True.

                     • engineio_logger  --  To  enable  Engine.IO logging set to True or pass a logger object to
                       use. To disable logging set to False. The default is False. Note that  fatal  errors  are
                       logged even when engineio_logger is False.

              on(message, namespace=None)
                     Decorator to register a SocketIO event handler.

                     This decorator must be applied to SocketIO event handlers. Example:

                        @socketio.on('my event', namespace='/chat')
                        def handle_my_custom_event(json):
                            print('received json: ' + str(json))

                     Parametersmessage  --  The  name of the event. This is normally a user defined string, but a
                              few event names are already defined. Use 'message' to define a handler that  takes
                              a  string  payload,  'json'  to  define  a handler that takes a JSON blob payload,
                              'connect' or 'disconnect' to create  handlers  for  connection  and  disconnection
                              events.

                            • namespace  --  The namespace on which the handler is to be registered. Defaults to
                              the global namespace.

              on_error(namespace=None)
                     Decorator to define a custom error handler for SocketIO events.

                     This decorator can be applied to a function that acts as an error handler for a  namespace.
                     This handler will be invoked when a SocketIO event handler raises an exception. The handler
                     function must accept one argument, which is the exception raised. Example:

                        @socketio.on_error(namespace='/chat')
                        def chat_error_handler(e):
                            print('An error has occurred: ' + str(e))

                     Parameters
                            namespace -- The namespace for which to register the error handler. Defaults to  the
                            global namespace.

              on_error_default(exception_handler)
                     Decorator to define a default error handler for SocketIO events.

                     This  decorator  can  be applied to a function that acts as a default error handler for any
                     namespaces that do not have a specific handler.  Example:

                        @socketio.on_error_default
                        def error_handler(e):
                            print('An error has occurred: ' + str(e))

              on_event(message, handler, namespace=None)
                     Register a SocketIO event handler.

                     on_event is the non-decorator version of 'on'.

                     Example:

                        def on_foo_event(json):
                            print('received json: ' + str(json))

                        socketio.on_event('my event', on_foo_event, namespace='/chat')

                     Parametersmessage -- The name of the event. This is normally a user defined  string,  but  a
                              few  event names are already defined. Use 'message' to define a handler that takes
                              a string payload, 'json' to define a handler  that  takes  a  JSON  blob  payload,
                              'connect'  or  'disconnect'  to  create  handlers for connection and disconnection
                              events.

                            • handler -- The function that handles the event.

                            • namespace -- The namespace on which the handler is to be registered.  Defaults  to
                              the global namespace.

              event(*args, **kwargs)
                     Decorator to register an event handler.

                     This  is  a  simplified  version  of  the  on()  method  that takes the event name from the
                     decorated function.

                     Example usage:

                        @socketio.event
                        def my_event(data):
                            print('Received data: ', data)

                     The above example is equivalent to:

                        @socketio.on('my_event')
                        def my_event(data):
                            print('Received data: ', data)

                     A custom namespace can be given as an argument to the decorator:

                        @socketio.event(namespace='/test')
                        def my_event(data):
                            print('Received data: ', data)

              emit(event, *args, **kwargs)
                     Emit a server generated SocketIO event.

                     This function emits a SocketIO event to one or more connected clients.  A JSON blob can  be
                     attached  to  the  event  as payload. This function can be used outside of a SocketIO event
                     context, so it is appropriate to use when the server is the originator of an event, outside
                     of  any  client  context,  such  as in a regular HTTP request handler or a background task.
                     Example:

                        @app.route('/ping')
                        def ping():
                            socketio.emit('ping event', {'data': 42}, namespace='/chat')

                     Parametersevent -- The name of the user event to emit.

                            • args -- A dictionary with the JSON data to send as payload.

                            • namespace -- The namespace under which the message is to be sent.  Defaults to the
                              global namespace.

                            • to  --  Send  the message to all the users in the given room. If this parameter is
                              not included, the event is sent to all connected users.

                            • include_self -- True to include the sender when broadcasting or addressing a room,
                              or False to send to everyone but the sender.

                            • skip_sid -- The session id of a client to ignore when broadcasting or addressing a
                              room. This is typically set to the originator of the  message,  so  that  everyone
                              except that client receive the message. To skip multiple sids pass a list.

                            • callback  -- If given, this function will be called to acknowledge that the client
                              has received the message. The arguments that will be passed to  the  function  are
                              those  provided by the client. Callback functions can only be used when addressing
                              an individual client.

              send(data, json=False, namespace=None, to=None, callback=None,  include_self=True,  skip_sid=None,
              **kwargs)
                     Send a server-generated SocketIO message.

                     This function sends a simple SocketIO message to one or more connected clients. The message
                     can be a string or a JSON blob. This is a  simpler  version  of  emit(),  which  should  be
                     preferred.  This  function  can  be  used  outside  of  a  SocketIO event context, so it is
                     appropriate to use when the server is the originator of an event.

                     Parametersdata -- The message to send, either a string or a JSON blob.

                            • json -- True if message is a JSON blob, False otherwise.

                            • namespace -- The namespace under which the message is to be sent.  Defaults to the
                              global namespace.

                            • to  --  Send the message only to the users in the given room. If this parameter is
                              not included, the message is sent to all connected users.

                            • include_self -- True to include the sender when broadcasting or addressing a room,
                              or False to send to everyone but the sender.

                            • skip_sid -- The session id of a client to ignore when broadcasting or addressing a
                              room. This is typically set to the originator of the  message,  so  that  everyone
                              except that client receive the message. To skip multiple sids pass a list.

                            • callback  -- If given, this function will be called to acknowledge that the client
                              has received the message. The arguments that will be passed to  the  function  are
                              those  provided by the client. Callback functions can only be used when addressing
                              an individual client.

              close_room(room, namespace=None)
                     Close a room.

                     This function removes any users that are in the given room and then deletes the  room  from
                     the server. This function can be used outside of a SocketIO event context.

                     Parametersroom -- The name of the room to close.

                            • namespace  --  The  namespace  under which the room exists. Defaults to the global
                              namespace.

              run(app, host=None, port=None, **kwargs)
                     Run the SocketIO web server.

                     Parametersapp -- The Flask application instance.

                            • host -- The hostname or IP address for the  server  to  listen  on.   Defaults  to
                              127.0.0.1.

                            • port -- The port number for the server to listen on. Defaults to 5000.

                            • debug -- True to start the server in debug mode, False to start in normal mode.

                            • use_reloader -- True to enable the Flask reloader, False to disable it.

                            • extra_files  --  A  list of additional files that the Flask reloader should watch.
                              Defaults to Nonelog_output -- If True, the server logs all incomming connections. If False logging
                              is  disabled.   Defaults  to True in debug mode, False in normal mode. Unused when
                              the threading async mode is used.

                            • kwargs -- Additional web server options. The web server options  are  specific  to
                              the  server  used in each of the supported async modes. Note that options provided
                              here will not be seen when using an external web server such  as  gunicorn,  since
                              this method is not called in that case.

              stop() Stop a running SocketIO web server.

                     This method must be called from a HTTP or SocketIO handler function.

              start_background_task(target, *args, **kwargs)
                     Start a background task using the appropriate async model.

                     This  is  a utility function that applications can use to start a background task using the
                     method that is compatible with the selected async mode.

                     Parameterstarget -- the target function to execute.

                            • args -- arguments to pass to the function.

                            • kwargs -- keyword arguments to pass to the function.

                     This function returns an object compatible with the Thread class  in  the  Python  standard
                     library. The start() method on this object is already called by this function.

              sleep(seconds=0)
                     Sleep for the requested amount of time using the appropriate async model.

                     This  is a utility function that applications can use to put a task to sleep without having
                     to worry about using the correct call for the selected async mode.

              test_client(app, namespace=None, query_string=None, headers=None, flask_test_client=None)
                     The Socket.IO test client is useful for testing a Flask-SocketIO  server.  It  works  in  a
                     similar way to the Flask Test Client, but adapted to the Socket.IO server.

                     Parametersapp -- The Flask application instance.

                            • namespace -- The namespace for the client. If not provided, the client connects to
                              the server on the global namespace.

                            • query_string -- A string with custom query string arguments.

                            • headers -- A dictionary with custom HTTP headers.

                            • flask_test_client -- The instance of the  Flask  test  client  currently  in  use.
                              Passing  the Flask test client is optional, but is necessary if you want the Flask
                              user session and any other cookies set in HTTP routes  accessible  from  Socket.IO
                              events.

       flask_socketio.emit(event, *args, **kwargs)
              Emit a SocketIO event.

              This function emits a SocketIO event to one or more connected clients. A JSON blob can be attached
              to the event as payload. This is a function that can only be called from a SocketIO event handler,
              as in obtains some information from the current client context. Example:

                 @socketio.on('my event')
                 def handle_my_custom_event(json):
                     emit('my response', {'data': 42})

              Parametersevent -- The name of the user event to emit.

                     • args -- A dictionary with the JSON data to send as payload.

                     • namespace  --  The  namespace  under  which  the  message is to be sent.  Defaults to the
                       namespace used by the originating event.  A '/' can be used  to  explicitly  specify  the
                       global namespace.

                     • callback -- Callback function to invoke with the client's acknowledgement.

                     • broadcast  --  True  to  send  the  message to all clients, or False to only reply to the
                       sender of the originating event.

                     • to -- Send the message to all the users in the given room. If this argument  is  not  set
                       and broadcast is False, then the message is sent only to the originating user.

                     • include_self  --  True  to  include the sender when broadcasting or addressing a room, or
                       False to send to everyone but the sender.

                     • skip_sid -- The session id of a client to ignore when broadcasting or addressing a  room.
                       This  is  typically  set  to  the originator of the message, so that everyone except that
                       client receive the message. To skip multiple sids pass a list.

                     • ignore_queue -- Only used when a message queue is configured. If set to True,  the  event
                       is  emitted  to  the  clients  directly,  without  going through the queue.  This is more
                       efficient, but only works when a single server process is used, or when there is a single
                       addressee.  It  is  recommended  to always leave this parameter with its default value of
                       False.

       flask_socketio.send(message, **kwargs)
              Send a SocketIO message.

              This function sends a simple SocketIO message to one or more connected clients. The message can be
              a string or a JSON blob. This is a simpler version of emit(), which should be preferred. This is a
              function that can only be called from a SocketIO event handler.

              Parametersmessage -- The message to send, either a string or a JSON blob.

                     • json -- True if message is a JSON blob, False otherwise.

                     • namespace -- The namespace under which the message  is  to  be  sent.   Defaults  to  the
                       namespace  used  by the originating event.  An empty string can be used to use the global
                       namespace.

                     • callback -- Callback function to invoke with the client's acknowledgement.

                     • broadcast -- True to send the message to all connected clients, or False to only reply to
                       the sender of the originating event.

                     • to  --  Send  the message to all the users in the given room. If this argument is not set
                       and broadcast is False, then the message is sent only to the originating user.

                     • include_self -- True to include the sender when broadcasting or  addressing  a  room,  or
                       False to send to everyone but the sender.

                     • skip_sid  -- The session id of a client to ignore when broadcasting or addressing a room.
                       This is typically set to the originator of the message,  so  that  everyone  except  that
                       client receive the message. To skip multiple sids pass a list.

                     • ignore_queue  --  Only used when a message queue is configured. If set to True, the event
                       is emitted to the clients directly, without  going  through  the  queue.   This  is  more
                       efficient, but only works when a single server process is used, or when there is a single
                       addressee. It is recommended to always leave this parameter with  its  default  value  of
                       False.

       flask_socketio.join_room(room, sid=None, namespace=None)
              Join a room.

              This function puts the user in a room, under the current namespace. The user and the namespace are
              obtained from the event context. This is a function that can only be called from a SocketIO  event
              handler. Example:

                 @socketio.on('join')
                 def on_join(data):
                     username = session['username']
                     room = data['room']
                     join_room(room)
                     send(username + ' has entered the room.', room=room)

              Parametersroom -- The name of the room to join.

                     • sid  --  The  session  id of the client. If not provided, the client is obtained from the
                       request context.

                     • namespace -- The namespace for the room. If not provided, the namespace is obtained  from
                       the request context.

       flask_socketio.leave_room(room, sid=None, namespace=None)
              Leave a room.

              This  function  removes  the  user  from  a  room,  under the current namespace.  The user and the
              namespace are obtained from the event context. Example:

                 @socketio.on('leave')
                 def on_leave(data):
                     username = session['username']
                     room = data['room']
                     leave_room(room)
                     send(username + ' has left the room.', room=room)

              Parametersroom -- The name of the room to leave.

                     • sid -- The session id of the client. If not provided, the client  is  obtained  from  the
                       request context.

                     • namespace  -- The namespace for the room. If not provided, the namespace is obtained from
                       the request context.

       flask_socketio.close_room(room, namespace=None)
              Close a room.

              This function removes any users that are in the given room and then  deletes  the  room  from  the
              server.

              Parametersroom -- The name of the room to close.

                     • namespace  -- The namespace for the room. If not provided, the namespace is obtained from
                       the request context.

       flask_socketio.rooms(sid=None, namespace=None)
              Return a list of the rooms the client is in.

              This function returns all the rooms the client has entered, including its own  room,  assigned  by
              the Socket.IO server.

              Parameterssid  --  The  session  id of the client. If not provided, the client is obtained from the
                       request context.

                     • namespace -- The namespace for the room. If not provided, the namespace is obtained  from
                       the request context.

       flask_socketio.disconnect(sid=None, namespace=None, silent=False)
              Disconnect the client.

              This  function terminates the connection with the client. As a result of this call the client will
              receive a disconnect event. Example:

                 @socketio.on('message')
                 def receive_message(msg):
                     if is_banned(session['username']):
                         disconnect()
                     else:
                         # ...

              Parameterssid -- The session id of the client. If not provided, the client  is  obtained  from  the
                       request context.

                     • namespace  -- The namespace for the room. If not provided, the namespace is obtained from
                       the request context.

                     • silent -- this option is deprecated.

       class flask_socketio.Namespace(namespace=None)

              trigger_event(event, *args)
                     Dispatch an event to the proper handler method.

                     In the most common usage, this method is not overloaded by subclasses, as it  performs  the
                     routing  of events to methods. However, this method can be overriden if special dispatching
                     rules are needed, or if having a single method that catches all events is desired.

              emit(event, data=None, room=None, include_self=True, namespace=None, callback=None)
                     Emit a custom event to one or more connected clients.

              send(data, room=None, include_self=True, namespace=None, callback=None)
                     Send a message to one or more connected clients.

              close_room(room, namespace=None)
                     Close a room.

       class flask_socketio.SocketIOTestClient(app, socketio, namespace=None,  query_string=None,  headers=None,
       flask_test_client=None)
              This  class  is useful for testing a Flask-SocketIO server. It works in a similar way to the Flask
              Test Client, but adapted to the Socket.IO server.

              Parametersapp -- The Flask application instance.

                     • socketio -- The application's SocketIO instance.

                     • namespace -- The namespace for the client. If not provided, the client  connects  to  the
                       server on the global namespace.

                     • query_string -- A string with custom query string arguments.

                     • headers -- A dictionary with custom HTTP headers.

                     • flask_test_client  -- The instance of the Flask test client currently in use. Passing the
                       Flask test client is optional, but is necessary if you want the Flask  user  session  and
                       any other cookies set in HTTP routes accessible from Socket.IO events.

              is_connected(namespace=None)
                     Check if a namespace is connected.

                     Parameters
                            namespace  --  The  namespace  to  check.  The  global  namespace is assumed if this
                            argument is not provided.

              connect(namespace=None, query_string=None, headers=None)
                     Connect the client.

                     Parametersnamespace -- The namespace for the client. If not provided, the client connects to
                              the server on the global namespace.

                            • query_string -- A string with custom query string arguments.

                            • headers -- A dictionary with custom HTTP headers.

                     Note that it is usually not necessary to explicitly call this method, since a connection is
                     automatically established when an instance of this class is created. An  example  where  it
                     this method would be useful is when the application accepts multiple namespace connections.

              disconnect(namespace=None)
                     Disconnect the client.

                     Parameters
                            namespace  --  The  namespace to disconnect. The global namespace is assumed if this
                            argument is not provided.

              emit(event, *args, **kwargs)
                     Emit an event to the server.

                     Parametersevent -- The event name.

                            • *args --

                              The event arguments.

                            • callback -- True if the client requests  a  callback,  False  if  not.  Note  that
                              client-side  callbacks  are not implemented, a callback request will just tell the
                              server to provide the arguments  to  invoke  the  callback,  but  no  callback  is
                              invoked.  Instead,  the  arguments  that  the server provided for the callback are
                              returned by this function.

                            • namespace -- The namespace of the event. The global namespace is assumed  if  this
                              argument is not provided.

              send(data, json=False, callback=False, namespace=None)
                     Send a text or JSON message to the server.

                     Parametersdata -- A string, dictionary or list to send to the server.

                            • json -- True to send a JSON message, False to send a text message.

                            • callback  --  True  if  the  client  requests  a callback, False if not. Note that
                              client-side callbacks are not implemented, a callback request will just  tell  the
                              server  to  provide  the  arguments  to  invoke  the  callback, but no callback is
                              invoked. Instead, the arguments that the server  provided  for  the  callback  are
                              returned by this function.

                            • namespace  --  The namespace of the event. The global namespace is assumed if this
                              argument is not provided.

              get_received(namespace=None)
                     Return the list of messages received from the server.

                     Since this is not a real client, any time the server emits an event, the  event  is  simply
                     stored.  The  test  code  can  invoke  this  method  to obtain the list of events that were
                     received since the last call.

                     Parameters
                            namespace -- The namespace to get events from. The global namespace  is  assumed  if
                            this argument is not provided.

AUTHOR

       Miguel Grinberg

       2014, Miguel Grinberg

                                                  Dec 24, 2020                                 FLASK-SOCKETIO(1)