{"library":"signalrcore","title":"SignalR Core Python Client","description":"signalrcore is a full-featured Python client for SignalR Core hubs, offering support for various transports (WebSockets, Server-Sent Events, Long Polling) and encodings (JSON, MessagePack). It's designed to be compatible with Azure SignalR Service and serverless functions, and includes robust automatic and manual reconnection capabilities. The library abstracts away the complexities of SignalR protocol negotiation, transport fallback, and message dispatching, allowing developers to focus on defining event callbacks. Currently at version 1.0.2, it receives active development and maintenance.","language":"python","status":"active","last_verified":"Wed May 20","install":{"commands":["pip install signalrcore"],"cli":null},"imports":["from signalrcore.hub_connection_builder import HubConnectionBuilder","from signalrcore.aio.aio_hub_connection_builder import AIOHubConnectionBuilder"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import logging\nimport time\nimport os\nfrom signalrcore.hub_connection_builder import HubConnectionBuilder\n\n# Configure logging for better visibility\nhandler = logging.StreamHandler()\nhandler.setLevel(logging.DEBUG)\n\nhub_connection = HubConnectionBuilder() \\\n    .with_url(os.environ.get('SIGNALR_HUB_URL', 'http://localhost:5000/hub')) \\\n    .configure_logging(logging.DEBUG, socket_trace=True, handler_mapping={\n        \"httpx\": logging.WARNING,\n        \"websocket\": logging.WARNING,\n        \"urllib3\": logging.WARNING\n    }) \\\n    .with_automatic_reconnect({\n        \"type\": \"interval\",\n        \"keep_alive_interval\": 10,\n        \"intervals\": [1, 2, 5, 10, 15, 30] # In seconds\n    }) \\\n    .build()\n\nhub_connection.on_open(lambda: print(\"Connection opened.\"))\nhub_connection.on_close(lambda: print(\"Connection closed.\"))\nhub_connection.on_error(lambda data: print(f\"Connection error: {data.error}\"))\n\n# Define a callback for a specific method on the hub\ndef receive_message(args):\n    print(f\"Received message: {args}\")\n\nhub_connection.on(\"ReceiveMessage\", receive_message)\n\nprint(\"Starting connection...\")\nhub_connection.start()\nprint(\"Connection started.\")\n\n# Keep the connection alive for some time and send a message\ntry:\n    # Give some time for the connection to establish and possibly auto-reconnect\n    time.sleep(5)\n    if hub_connection.connected:\n        print(\"Sending message to hub...\")\n        hub_connection.send(\"SendMessage\", [\"PythonClient\", \"Hello from Python!\"])\n        print(\"Message sent. Waiting for 30 seconds to receive messages or keep alive.\")\n        time.sleep(30) # Keep connection alive and listen for messages\n    else:\n        print(\"Connection not established or reconnected. Cannot send message.\")\n\nexcept KeyboardInterrupt:\n    pass\nfinally:\n    print(\"Stopping connection...\")\n    hub_connection.stop()\n    print(\"Connection stopped.\")","lang":"python","description":"This example demonstrates how to establish a connection to a SignalR hub, set up event handlers for connection status, register a callback for a server-side method, and send messages. It includes basic logging configuration and automatic reconnection, and uses an environment variable for the hub URL for better configurability. Remember to replace `http://localhost:5000/hub` with your actual SignalR hub URL.","tag":null,"tag_description":null,"last_tested":"2026-04-25","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-20","installed_version":"1.0.2","pypi_latest":"1.0.2","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.7,"avg_import_s":0.23,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.18,"mem_mb":6.2,"disk_size":"19.5M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":6.2,"disk_size":"19.5M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.13,"mem_mb":6.2,"disk_size":"20M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":6.2,"disk_size":"20M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.26,"mem_mb":6.7,"disk_size":"21.4M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.41,"mem_mb":6.7,"disk_size":"21.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.23,"mem_mb":6.7,"disk_size":"22M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.29,"mem_mb":6.7,"disk_size":"22M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.22,"mem_mb":6.3,"disk_size":"13.3M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.28,"mem_mb":6.3,"disk_size":"13.3M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.22,"mem_mb":6.3,"disk_size":"14M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.29,"mem_mb":6.3,"disk_size":"14M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.2,"mem_mb":6.4,"disk_size":"13.1M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":6.4,"disk_size":"12.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.2,"mem_mb":6.4,"disk_size":"14M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":6.4,"disk_size":"14M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.16,"mem_mb":5.9,"disk_size":"19.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":5.9,"disk_size":"19.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.14,"mem_mb":5.9,"disk_size":"20M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"signalrcore","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.21,"mem_mb":5.9,"disk_size":"20M"}]}}