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 websockets2. 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_aelio4. 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 runserver5. 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.