Saltar al contenido principal

Adaptadores de framework

SDK de Python

Un cliente de servidor para backends de Python, sin nada fuera de la biblioteca estándar. Cada llamada nombra al usuario, porque un proceso atiende a muchos.

Dónde se publica

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

Instalación

Bash
pip install prodantix-sdk

Cada llamada nombra al usuario

Un cliente de navegador puede recordar quién lo está usando; un servidor no. Por eso el id del usuario es el primer argumento de capture, identify, group y de las lecturas de la bandeja de entrada. Esa es la única diferencia de forma con los clientes de navegador y móvil.

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")

Banderas remotas y locales

Una comprobación remota pregunta al servidor y es la autoritativa. Una comprobación local evalúa en el proceso una instantánea en caché del conjunto de reglas, sin ida y vuelta por llamada, que es lo que pide una ruta caliente.

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)

Envío y cierre

Los eventos entran en una cola segura para hilos y un enviador en segundo plano los manda por lotes, por conteo o por temporizador, lo que ocurra antes. Usa el cliente como gestor de contexto y el último lote se envía al salir del bloque.

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