Aller au contenu principal

Adaptateurs de framework

SDK Python

Un client serveur pour les backends Python, sans rien en dehors de la bibliothèque standard. Chaque appel nomme l'utilisateur, car un même processus en sert beaucoup.

Où il est publié

prodantix-sdk on PyPI. Requires Python 3.9 or newer.

Installation

Bash
pip install prodantix-sdk

Chaque appel nomme l'utilisateur

Un client navigateur peut retenir qui l'utilise ; un serveur, non. L'identifiant de l'utilisateur est donc le premier argument de capture, identify, group et des lectures de la boîte de réception. C'est la seule différence de forme avec les clients navigateur et mobile.

Python
import os
from prodantix import Client

client = Client(
    api_key=os.environ["PRODANTIX_PUBLIC_KEY"],
    host="https://eu.api.prodantix.com",
)

client.capture("user-123", "order.completed", properties={"total": 42, "currency": "XAF"})
client.identify("user-123", set_props={"plan": "pro"})
client.group("user-123", "company", "acme", properties={"seats": 10})

for message in client.get_inbox("user-123"):
    ...

client.mark_message_read("user-123", "message-id")

Drapeaux distants et locaux

Une vérification distante interroge le serveur et fait autorité. Une vérification locale évalue dans le processus un instantané mis en cache du jeu de règles, sans aller-retour à chaque appel, ce qu'exige un chemin critique.

Python
# Remote: asks the server, and is the authoritative answer.
if client.is_feature_enabled("user-123", "new-checkout"):
    ...

# Local: evaluated in process from a cached snapshot, no round trip per call.
if client.is_feature_enabled_local("user-123", "new-checkout", properties={"plan": "pro"}):
    ...

every_flag = client.get_all_flags("user-123")

# Every per-flag read records one $feature_flag_called exposure.
variant = client.get_variant("user-123", "new-checkout")
if variant and variant["key"] == "treatment":
    ...

# A flag targeting a cohort reads the user's memberships from the store;
# pass cohorts=[...] to skip the lookup.
if client.is_feature_enabled_local("user-123", "members", cohorts=["<cohort id>"]):
    ...

# With stream_flags=True the client holds a Socket.IO subscription and refetches
# the snapshot when a flag changes, instead of waiting for the 30s poll.
client = Client(api_key=os.environ["PRODANTIX_PUBLIC_KEY"], host="https://eu.api.prodantix.com", stream_flags=True)

Envoi et arrêt

Les événements entrent dans une file sûre pour les threads, et un vidangeur en arrière-plan les envoie par lots, selon un compteur ou un minuteur, au premier des deux. Utilisez le client comme gestionnaire de contexte : le dernier lot part à la sortie du bloc.

Python
with Client(api_key=..., host=...) as client:
    client.capture("user-123", "page.viewed")
# the final batch is flushed here

# Without the context manager, flush and stop the background flusher yourself.
client.shutdown()
ArgumentDefaultPurpose
api_keyrequiredPublic project key (pdx_pub_…)
hostrequiredIngest base URL
flags_hosthostBase URL for the flags and inbox endpoints
flush_at20Queue size that triggers an immediate flush
flush_interval_s10.0Background flush cadence; 0 or less disables the timer
max_queue_size1000Cap; the oldest events are dropped on overflow
max_retries3Delivery retry attempts
request_timeout_s10.0Per-request timeout
default_propertiesNoneA dict or a callable merged into every event
on_errorno-opCalled with any capture or background error
stream_flagsFalseHold a Socket.IO subscription to flag changes and refetch the snapshot on push
socket_factorystdlib clientBuilds the websocket the flag stream uses; the test seam