azure-messaging-webpubsubservice-py
microsoft/skills
Envoyez des messages en temps réel et gérez les connexions WebSocket à l'aide du SDK Azure Web PubSub Service pour Python.
...Développer toutSDK Azure Web PubSub pour Python
Messagerie en temps réel avec des connexions WebSocket à grande échelle.
Installation
# SDK de service (côté serveur)
pip install azure-messaging-webpubsubservice
# SDK client (pour les clients WebSocket Python)
pip install azure-messaging-webpubsubclient
Variables d'environnement
AZURE_WEBPUBSUB_HUB=my-hub # Obligatoire pour toutes les méthodes d'authentification
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production
Authentification et cycle de vie
🔑 Deux règles s'appliquent à chaque exemple de code ci-dessous :
- Privilégiez
DefaultAzureCredential. Il fonctionne localement (Azure CLI / VS Code / CLI développeur) et dans Azure (identité managée, identité de charge de travail) sans modification de code. Évitez les chaînes de connexion, les comptes/clés API — ils contournent l'audit Entra et la rotation.
- Développement local :
DefaultAzureCredentialfonctionne tel quel.- Production : définissez
AZURE_TOKEN_CREDENTIALS=prod(ouAZURE_TOKEN_CREDENTIALS=<specific_credential></specific_credential>) pour limiter la chaîne d'identification aux identifiants sécurisés pour la production.- Enveloppez chaque client dans un gestionnaire de contexte afin que les transports HTTP, les sockets et les caches de jetons soient libérés de manière déterministe :
- Synchrone :
with <client>(...) as client:</client>- Asynchrone :
async with <client>(...) as client:</client>etasync with DefaultAzureCredential() as credential:(deazure.identity.aio)Les extraits de code peuvent abréger cette configuration, mais le code de production doit toujours respecter les deux règles.
Client de service (côté serveur)
Authentification
from azure.messaging.webpubsubservice import WebPubSubServiceClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
# Développement local : DefaultAzureCredential. Production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utilisez un identifiant spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with WebPubSubServiceClient(
endpoint="https://<name>.webpubsub.azure.com",
hub="my-hub",
credential=credential
) as client:
# Utilisez `client` pour toutes les opérations ultérieures (voir exemples ci-dessous)
...
</name></specific_credential>Générer un jeton d'accès client
# Jeton pour utilisateur anonyme
token = client.get_client_access_token()
print(f"URL : {token['url']}")
# Jeton avec identifiant utilisateur
token = client.get_client_access_token(
user_id="user123",
roles=["webpubsub.sendToGroup", "webpubsub.joinLeaveGroup"]
)
# Jeton avec groupes
token = client.get_client_access_token(
user_id="user123",
groups=["group1", "group2"]
)
Envoyer à tous les clients
# Envoyer du texte
client.send_to_all(message="Bonjour à tous !", content_type="text/plain")
# Envoyer du JSON
client.send_to_all(
message={"type": "notification", "data": "Bonjour"},
content_type="application/json"
)
Envoyer à un utilisateur
client.send_to_user(
user_id="user123",
message="Bonjour utilisateur !",
content_type="text/plain"
)
Envoyer à un groupe
client.send_to_group(
group="my-group",
message="Bonjour groupe !",
content_type="text/plain"
)
Envoyer à une connexion
client.send_to_connection(
connection_id="abc123",
message="Bonjour connexion !",
content_type="text/plain"
)
Gestion des groupes
# Ajouter un utilisateur au groupe
client.add_user_to_group(group="my-group", user_id="user123")
# Retirer un utilisateur du groupe
client.remove_user_from_group(group="my-group", user_id="user123")
# Ajouter une connexion au groupe
client.add_connection_to_group(group="my-group", connection_id="abc123")
# Retirer une connexion du groupe
client.remove_connection_from_group(group="my-group", connection_id="abc123")
Gestion des connexions
# Vérifier si la connexion existe
exists = client.connection_exists(connection_id="abc123")
# Vérifier si l'utilisateur a des connexions
exists = client.user_exists(user_id="user123")
# Vérifier si le groupe a des connexions
exists = client.group_exists(group="my-group")
# Fermer la connexion
client.close_connection(connection_id="abc123", reason="Session terminée")
# Fermer toutes les connexions pour l'utilisateur
client.close_all_connections(user_id="user123")
Accorder/Révoquer les autorisations
from azure.messaging.webpubsubservice import WebPubSubServiceClient
# Accorder une autorisation
client.grant_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
# Révoquer une autorisation
client.revoke_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
# Vérifier l'autorisation
has_permission = client.check_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
SDK Client (Client WebSocket Python)
from azure.messaging.webpubsubclient import WebPubSubClient
with WebPubSubClient(credential=token["url"]) as client:
@client.on("connected")
def on_connected(e):
print(f"Connecté : {e.connection_id}")
@client.on("server-message")
def on_message(e):
print(f"Message : {e.data}")
@client.on("group-message")
def on_group_message(e):
print(f"Groupe {e.group} : {e.data}")
client.send_to_group("my-group", "Bonjour depuis Python !")
Client de service asynchrone
from azure.messaging.webpubsubservice.aio import WebPubSubServiceClient
from azure.identity.aio import DefaultAzureCredential
async def broadcast():
async with DefaultAzureCredential() as credential:
async with WebPubSubServiceClient(
endpoint="https://<name>.webpubsub.azure.com",
hub="my-hub",
credential=credential
) as client:
await client.send_to_all("Bonjour asynchrone !", content_type="text/plain")
</name>Opérations client
| Opération | Description |
|---|---|
| `get_client_access_token` | Générer l'URL de connexion WebSocket |
| `send_to_all` | Diffuser à toutes les connexions |
| `send_to_user` | Envoyer à un utilisateur spécifique |
| `send_to_group` | Envoyer aux membres du groupe |
| `send_to_connection` | Envoyer à une connexion spécifique |
| `add_user_to_group` | Ajouter un utilisateur au groupe |
| `remove_user_from_group` | Retirer un utilisateur du groupe |
| `close_connection` | Déconnecter le client |
| `connection_exists` | Vérifier l'état de la connexion |
Meilleures pratiques
- Choisissez synchrone OU asynchrone et restez cohérent. Ne mélangez pas les clients synchrones
azure.xxxavec les clients asynchronesazure.xxx.aiodans le même chemin d'appel. Choisissez un mode par module. - Toujours utiliser des gestionnaires de contexte pour les clients et les identifiants asynchrones. Enveloppez chaque client dans
with Client(...) as client:(synchrone) ouasync with Client(...) as client:(asynchrone). PourDefaultAzureCredentialasynchrone deazure.identity.aio, utilisez égalementasync with credential:afin que les jetons et les transports soient nettoyés. - Utilisez
DefaultAzureCredentialpour une authentification portable entre le développement local et Azure (évitez les chaînes de connexion / clés d'accès dans la mesure du possible). - Utilisez les rôles pour limiter les autorisations des clients
- Utilisez les groupes pour la messagerie ciblée
- Générez des jetons à courte durée de vie pour la sécurité
- Utilisez les identifiants utilisateur pour envoyer des messages aux utilisateurs sur plusieurs connexions
- Gérez la reconnexion dans les applications clientes
- Utilisez le type de contenu JSON pour les données structurées
- Fermez les connexions de manière élégante avec des raisons
---
name: azure-messaging-webpubsubservice-py
description: Send real-time messages and manage WebSocket connections using Azure Web PubSub Service SDK for Python.
license: MIT
---
# Azure Web PubSub Service SDK for Python
Real-time messaging with WebSocket connections at scale.
## Installation
```bash
# Service SDK (server-side)
pip install azure-messaging-webpubsubservice
# Client SDK (for Python WebSocket clients)
pip install azure-messaging-webpubsubclient
```
## Environment Variables
```bash
AZURE_WEBPUBSUB_HUB=my-hub # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication & Lifecycle
> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - Local dev: `DefaultAzureCredential` works as-is.
> - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
## Service Client (Server-Side)
### Authentication
```python
from azure.messaging.webpubsubservice import WebPubSubServiceClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with WebPubSubServiceClient(
endpoint="https://<name>.webpubsub.azure.com",
hub="my-hub",
credential=credential
) as client:
# Use `client` for all subsequent operations (see examples below)
...
```
### Generate Client Access Token
```python
# Token for anonymous user
token = client.get_client_access_token()
print(f"URL: {token['url']}")
# Token with user ID
token = client.get_client_access_token(
user_id="user123",
roles=["webpubsub.sendToGroup", "webpubsub.joinLeaveGroup"]
)
# Token with groups
token = client.get_client_access_token(
user_id="user123",
groups=["group1", "group2"]
)
```
### Send to All Clients
```python
# Send text
client.send_to_all(message="Hello everyone!", content_type="text/plain")
# Send JSON
client.send_to_all(
message={"type": "notification", "data": "Hello"},
content_type="application/json"
)
```
### Send to User
```python
client.send_to_user(
user_id="user123",
message="Hello user!",
content_type="text/plain"
)
```
### Send to Group
```python
client.send_to_group(
group="my-group",
message="Hello group!",
content_type="text/plain"
)
```
### Send to Connection
```python
client.send_to_connection(
connection_id="abc123",
message="Hello connection!",
content_type="text/plain"
)
```
### Group Management
```python
# Add user to group
client.add_user_to_group(group="my-group", user_id="user123")
# Remove user from group
client.remove_user_from_group(group="my-group", user_id="user123")
# Add connection to group
client.add_connection_to_group(group="my-group", connection_id="abc123")
# Remove connection from group
client.remove_connection_from_group(group="my-group", connection_id="abc123")
```
### Connection Management
```python
# Check if connection exists
exists = client.connection_exists(connection_id="abc123")
# Check if user has connections
exists = client.user_exists(user_id="user123")
# Check if group has connections
exists = client.group_exists(group="my-group")
# Close connection
client.close_connection(connection_id="abc123", reason="Session ended")
# Close all connections for user
client.close_all_connections(user_id="user123")
```
### Grant/Revoke Permissions
```python
from azure.messaging.webpubsubservice import WebPubSubServiceClient
# Grant permission
client.grant_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
# Revoke permission
client.revoke_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
# Check permission
has_permission = client.check_permission(
permission="joinLeaveGroup",
connection_id="abc123",
target_name="my-group"
)
```
## Client SDK (Python WebSocket Client)
```python
from azure.messaging.webpubsubclient import WebPubSubClient
with WebPubSubClient(credential=token["url"]) as client:
@client.on("connected")
def on_connected(e):
print(f"Connected: {e.connection_id}")
@client.on("server-message")
def on_message(e):
print(f"Message: {e.data}")
@client.on("group-message")
def on_group_message(e):
print(f"Group {e.group}: {e.data}")
client.send_to_group("my-group", "Hello from Python!")
```
## Async Service Client
```python
from azure.messaging.webpubsubservice.aio import WebPubSubServiceClient
from azure.identity.aio import DefaultAzureCredential
async def broadcast():
async with DefaultAzureCredential() as credential:
async with WebPubSubServiceClient(
endpoint="https://<name>.webpubsub.azure.com",
hub="my-hub",
credential=credential
) as client:
await client.send_to_all("Hello async!", content_type="text/plain")
```
## Client Operations
| Operation | Description |
|-----------|-------------|
| `get_client_access_token` | Generate WebSocket connection URL |
| `send_to_all` | Broadcast to all connections |
| `send_to_user` | Send to specific user |
| `send_to_group` | Send to group members |
| `send_to_connection` | Send to specific connection |
| `add_user_to_group` | Add user to group |
| `remove_user_from_group` | Remove user from group |
| `close_connection` | Disconnect client |
| `connection_exists` | Check connection status |
## Best Practices
1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for portable auth across local dev and Azure (avoid connection strings / access keys when possible).
4. **Use roles** to limit client permissions
4. **Use groups** for targeted messaging
5. **Generate short-lived tokens** for security
6. **Use user IDs** to send to users across connections
7. **Handle reconnection** in client applications
8. **Use JSON** content type for structured data
9. **Close connections** gracefully with reasons
Tous les fichiers
0 fichiersInstaller azure-messaging-webpubsubservice-py
Téléchargez et extrayez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-messaging-webpubsubservice-py # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
