Skip to main content

Weni's feature flags SDK for Python backends

Project description

Weni Feature Flags

Weni feature flags SDK for Python backends

What is it

Weni Feature Flags is a Python Library that functions as an abstraction layer between Django projects and GrowthBook.

Requirements

  • Python: 3.8+
  • Django: 3.2.22+
  • Django REST Framework: 3.14.0+
  • Celery: 5.0+

This project also relies on Celery to update feature flags asynchronously. This library uses Django's cache abstraction to avoid hitting the database constantly and also reduce latency.

Installation

To install it, you can use both pip or Poetry.

Using PIP

pip install weni-feature-flags

Using Poetry

poetry add weni-feature-flags

Initial configuration

On your Django project, you should add "weni_feature_flags" to INSTALLED_APPS. When testing and deploying you should apply the migrations using:

python manage.py migrate

This library saves a snapshot of the feature flags on your database and cache layer to be resilient to eventual GrowthBook unavailability.

Quick Start

Here's a minimal example to get you started:

  1. Install the package:
pip install weni-feature-flags
  1. Add to Django settings:
# settings.py
INSTALLED_APPS = [
    # ... other apps
    'weni_feature_flags',
]

# Environment variables
GROWTHBOOK_CLIENT_KEY = "your-client-key"
GROWTHBOOK_HOST_BASE_URL = "https://your-growthbook-instance.com"
  1. Run migrations:
python manage.py migrate
  1. Use in your code:
from weni_feature_flags.shortcuts import is_feature_active

# Check if a feature is active for a user
if is_feature_active("new-dashboard", "user@example.com", "project-uuid"):
    # Show new dashboard
    pass

SDK Connection

On GrowthBook, you can create a Python SDK connection, which you generate your client key. You should save this client key and use it as the GROWTHBOOK_CLIENT_KEY environment variable, as well as your GrowthBook host to GROWTHBOOK_HOST_BASE_URL.

Remember to select the correct environment and project on the "New SDK Connection" modal.

Webhooks

You can also configure webhooks to apply feature flags changes faster. For this, first import the webhook view and configure it in your Django project's URLs

from django.urls import path
from weni_feature_flags.views import FeatureFlagsWebhookView

urlpatterns = [
    path('webhooks/feature-flags/', FeatureFlagsWebhookView.as_view(), name='feature-flags-webhook'),
]

Then, create a strong secret and save it to GROWTHBOOK_WEBHOOK_SECRET.

On Growthbook, access Settings -> Webhooks and create a new event webhook. It should be configured to use POST as the method and, on the Headers (JSON) section, include the secret that you created:

{
    "secret": "<YOUR SECRET HERE>"
}

You should select the events "feature.created", "feature.updated" and "feature.deleted" and select your environment and project.

Usage

Using the Service Class

You can import and use the whole feature flags service like this:

from weni_feature_flags.services import FeatureFlagsService

service = FeatureFlagsService()

# Get all feature flags data
features = service.get_features()

# Get active feature flags for specific attributes
active_features = service.get_active_feature_flags_for_attributes({
    "userEmail": "user@example.com",
    "projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
})

# Evaluate a specific feature flag by attributes
is_active = service.evaluate_feature_flag_by_attributes(
    "feature-key", 
    {
        "userEmail": "user@example.com",
        "projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
    }
)

Using Shortcuts

If you only really need to check whether a user and project have access to a feature, you can use shortcuts:

from weni_feature_flags.shortcuts import is_feature_active, is_feature_active_for_attributes

Using Shortcuts

If you want to check if a certain user in a certain project has access to a feature, you can use

# feature key/name, user's email, project's UUID
if is_feature_active("featureKey", "user@email.com", "8065619a-2b22-4351-9914-e37c6394b1d3"):
    # Something cool happens

Or, if you set the feature up in a different way, you can pass the attributes directly using:

# Just checks the project

# feature key/name, attributes
if is_feature_active_for_attributes("featureKey", {"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"}):
    pass

# Just checks the user's email
if is_feature_active_for_attributes("featureKey", {"userEmail": "user@email.com"}):
    pass

# Or any other rule that you have defined on GrowthBook
if is_feature_active_for_attributes("featureKey", {"example": "test"}):
    pass

Technical Details

Database Models

This library creates the following database models:

  • FeatureFlag: Stores feature flag definitions and their current state
  • FeatureFlagSnapshot: Maintains historical snapshots of feature flags for resilience

Caching Strategy

  • Feature flags are cached using Django's cache framework
  • Cache keys are prefixed with CACHE_KEY_PREFIX (default: "weni_feature_flags")
  • Cache TTL is configurable via FEATURES_CACHE_TTL (default: 60 seconds)
  • When GrowthBook is unavailable, the library falls back to cached data

Troubleshooting

Common Issues

Feature flags not updating

  • Check if Celery is running and processing tasks
  • Verify webhook configuration and secret
  • Check GrowthBook connection settings

GrowthBook connection errors

  • Verify GROWTHBOOK_CLIENT_KEY and GROWTHBOOK_HOST_BASE_URL
  • Check network connectivity to GrowthBook
  • Review timeout settings (GROWTHBOOK_REQUESTS_TIMEOUT)

Cache issues

  • Ensure that you have a caching backend, such as Redis, configured

Webhook not working

  • Verify webhook URL is accessible
  • Check GROWTHBOOK_WEBHOOK_SECRET matches GrowthBook configuration
  • Review webhook event selection in GrowthBook

All environment variables

Variable Required Default Description
GROWTHBOOK_CLIENT_KEY Yes - Client key for GrowthBook SDK connection
GROWTHBOOK_HOST_BASE_URL Yes - Base URL of your GrowthBook instance
GROWTHBOOK_REQUESTS_TIMEOUT No 60 Timeout in seconds for GrowthBook API requests
GROWTHBOOK_WEBHOOK_SECRET No - Secret key for webhook authentication
CACHE_KEY_PREFIX No weni_feature_flags Prefix for cache keys
FEATURES_CACHE_TTL No 60 Cache TTL in seconds for feature flags

License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

weni_feature_flags-0.1.2.tar.gz (24.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

weni_feature_flags-0.1.2-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

File details

Details for the file weni_feature_flags-0.1.2.tar.gz.

File metadata

  • Download URL: weni_feature_flags-0.1.2.tar.gz
  • Upload date:
  • Size: 24.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.6.87.2-microsoft-standard-WSL2

File hashes

Hashes for weni_feature_flags-0.1.2.tar.gz
Algorithm Hash digest
SHA256 471efa05a692cd771cdc7eab01025ecbb317687b335e12ed42e882b27aa8725d
MD5 746342347c26894a12351ca755b2ea9c
BLAKE2b-256 c6a2bc61834c74c7941c1fc7f41f780a7ee587af87ddbd9685bf7ec075310681

See more details on using hashes here.

File details

Details for the file weni_feature_flags-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: weni_feature_flags-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 28.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.6.87.2-microsoft-standard-WSL2

File hashes

Hashes for weni_feature_flags-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 dbd3f5cba814e34baaed0c462a45e0e9624b5122503903dee35cc3a2975f4cf0
MD5 336c672c2aa86a8c92ae6dd13c279ca7
BLAKE2b-256 dd431e07318f7c6302bc5924b044cc7103a0086f84dae7c4c577df4069125d84

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page