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.12.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-2.1.2.tar.gz (24.4 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-2.1.2-py3-none-any.whl (28.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: weni_feature_flags-2.1.2.tar.gz
  • Upload date:
  • Size: 24.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.8.18 Linux/6.11.0-1018-azure

File hashes

Hashes for weni_feature_flags-2.1.2.tar.gz
Algorithm Hash digest
SHA256 f38544ab5a8ec08d6257127769c2aa7dc64c709c75ffe613be82188aa29f7404
MD5 0675969871cf4a418f8b1bd3a1bd214d
BLAKE2b-256 91de7d1a3a69bf35591aec97b25aafa618f8c3ca1eb3a3fc722382a6491012ce

See more details on using hashes here.

File details

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

File metadata

  • Download URL: weni_feature_flags-2.1.2-py3-none-any.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.5 CPython/3.8.18 Linux/6.11.0-1018-azure

File hashes

Hashes for weni_feature_flags-2.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ce8ef0b8b0a78fa75c2399469b6deaeb4518cc4568b85111663080992536a3c4
MD5 68f67c3bf0354c3e7274b321f2bc14b8
BLAKE2b-256 8fa441a0bb28b0ec96b864d9e8dfa7684c8428eb06b1bc0a1cb06bc39a21dc52

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