Python SDK
Isang server client para sa mga backend na Python, na walang anumang nasa labas ng standard library. Pinangangalanan ng bawat tawag ang user, dahil marami silang pinagsisilbihan ng isang proseso.
Saan ito nakalathala
prodantix-sdk on PyPI. Requires Python 3.9 or newer.
I-install
pip install prodantix-sdkPinangangalanan ng bawat tawag ang user
Maaalala ng isang browser client kung sino ang gumagamit nito; hindi ito kayang gawin ng server. Kaya ang distinct id ang unang argumento sa capture, identify, group, at sa pagbasa ng inbox. Iyon lang ang pagkakaiba ng hugis nito sa browser at mobile na client.
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")Mga remote at lokal na flag
Ang remote na tsek ay nagtatanong sa server at ito ang may bisa. Ang lokal na tsek ay sinusuri ang naka-cache na snapshot ng ruleset sa loob mismo ng proseso, walang round trip kada tawag, at iyon ang kailangan ng isang hot path.
# 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)Paghahatid at pagsasara
Pumapasok ang mga event sa isang thread-safe na pila at ipinapadala ng background flusher nang batch-batch, ayon sa bilang o sa timer, alinman ang mauna. Gamitin ang client bilang context manager at ipapadala ang huling batch pagtapos ng block.
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()| Argument | Default | Purpose |
|---|---|---|
| api_key | required | Public project key (pdx_pub_…) |
| host | required | Ingest base URL |
| flags_host | host | Base URL for the flags and inbox endpoints |
| flush_at | 20 | Queue size that triggers an immediate flush |
| flush_interval_s | 10.0 | Background flush cadence; 0 or less disables the timer |
| max_queue_size | 1000 | Cap; the oldest events are dropped on overflow |
| max_retries | 3 | Delivery retry attempts |
| request_timeout_s | 10.0 | Per-request timeout |
| default_properties | None | A dict or a callable merged into every event |
| on_error | no-op | Called with any capture or background error |
| stream_flags | False | Hold a Socket.IO subscription to flag changes and refetch the snapshot on push |
| socket_factory | stdlib client | Builds the websocket the flag stream uses; the test seam |