Aelio
PlatformsPython

Python + Django

Integrate aelio-sdk with Django — management command and async views.

Django integration uses the same aelio-sdk package. The SDK WebSocket connection runs as a background process alongside Django.

1. Install

pip install aelio-sdk django websockets

2. Create Aelio service module

# myapp/aelio_service.py
import os
import asyncio
import threading
from aelio_sdk import Aelio

aelio = Aelio(
    secret=os.environ.get("AELIO_SDK_SECRET", "change-me-in-production"),
    url=os.environ.get("AELIO_SERVER_URL", "ws://127.0.0.1:3010"),
)


@aelio.expose("getOrderStatus", description="Get order status", params={"orderId": "string"}, safety="read")
async def get_order_status(args, ctx):
    from myapp.models import Order
    order = await Order.objects.aget(id=args["orderId"], user_id=ctx["customerId"])
    return {"orderId": order.id, "status": order.status}


@aelio.expose("cancelOrder", description="Cancel order", params={"orderId": "string"}, safety="write")
async def cancel_order(args, ctx):
    from myapp.models import Order
    order = await Order.objects.aget(id=args["orderId"], user_id=ctx["customerId"])
    order.status = "cancelled"
    await order.asave()
    return {"orderId": order.id, "status": "cancelled"}


def start_aelio_background():
    """Run SDK in a background thread."""
    thread = threading.Thread(target=aelio.run, daemon=True)
    thread.start()

3. Django management command

# myapp/management/commands/run_aelio.py
from django.core.management.base import BaseCommand
from myapp.aelio_service import aelio


class Command(BaseCommand):
    help = "Start Aelio SDK connection"

    def handle(self, *args, **options):
        self.stdout.write("Starting Aelio SDK...")
        aelio.run()

Run alongside Django:

# Terminal 1
python manage.py runserver

# Terminal 2
python manage.py run_aelio

4. Auto-start with AppConfig

# myapp/apps.py
from django.apps import AppConfig


class MyappConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "myapp"

    def ready(self):
        import os
        if os.environ.get("RUN_AELIO_SDK") == "1":
            from myapp.aelio_service import start_aelio_background
            start_aelio_background()
RUN_AELIO_SDK=1 python manage.py runserver

5. Lifecycle sync from views

# myapp/views.py
from django.http import JsonResponse
from myapp.aelio_service import aelio


async def place_order(request):
    order = await create_order(request)
    await aelio.set_customer_state(
        request.user.id, "post_purchase", "Order placed"
    )
    return JsonResponse({"orderId": order.id})

6. Chat token view

# myapp/views.py
import os
import httpx
from django.http import JsonResponse
from django.contrib.auth.decorators import login_required


@login_required
async def chat_token(request):
    async with httpx.AsyncClient() as client:
        res = await client.post(
            f"{os.environ['AELIO_HTTP_URL']}/auth/magic-link",
            headers={"Authorization": f"Bearer {os.environ['AELIO_SDK_SECRET']}"},
            json={"email": request.user.email, "externalId": str(request.user.id)},
        )
        data = res.json()
    return JsonResponse({"magicLinkUrl": data["url"]})

7. Embed widget in template

<!-- templates/base.html -->
{% if user.is_authenticated %}
<script
  src="{{ AELIO_SERVER_URL }}/widget.js"
  data-server-url="{{ AELIO_SERVER_URL }}"
  data-customer-id="{{ user.id }}"
  data-email="{{ user.email }}"
></script>
{% endif %}

Pass AELIO_SERVER_URL via Django context processor.

Note

The examples/python-django/ directory in the Aelio monorepo is currently a stub pointing to sdk/python/sdk.py. This guide provides the recommended Django integration pattern.

On this page