Skip to content

Instantly share code, notes, and snippets.

Use Case              Django         Flask         FastAPI                   
CRUD Web App          ✅ Excellent   ✅ Good       ⚠️ Minimal UI Support    
REST APIs             ✅ Moderate    ✅ Good       ✅ Excellent              
Async APIs (IoT, ML)  ❌ Not Ideal   ❌ Not Ideal  ✅ Perfect                
Streaming/WebSockets  ❌             ❌            ✅ Native support         
ML Model Serving      ⚠️ Heavy       ⚠️ Manual     ✅ Fast & lightweight     
Feature Uvicorn Gunicorn uWSGI mod_wsgi
Protocol ASGI WSGI WSGI WSGI
Async support ✅ Native ❌ WSGI-only
WebSockets
Event loop ✅ (uvloop)
HTTP/2 ✅ (experimental)
Hot reload (dev) ✅ --reload ⚠️ Indirect
Performance 🔥 High 🟡 Moderate
Attribute WSGI ASGI
Protocol HTTP only HTTP, WebSockets, etc.
Concurrency Blocking Non-blocking (async)
Performance Thread-based Event loop (faster under I/O load)
Frameworks Django, Flask FastAPI, Starlette, Django (partial)
Feature Flask Django FastAPI
Async Support 🚧 (limited) ✅ Native async
Type Hints & Validation 🚧 (via Django Forms) ✅ Pydantic-based
Auto OpenAPI Docs ✅ Swagger & ReDoc
Performance Moderate Moderate 🚀 High
Best For Prototyping Full-stack apps Async APIs & microservices
# Download the talisman installer script
curl https://thoughtworks.github.io/talisman/install.sh > ~/install-talisman.sh
chmod +x ~/install-talisman.sh
# Install to a single project
cd <project-folder>
# as a pre-push hook
@ereshzealous
ereshzealous / Talisman.md
Last active September 7, 2023 04:38
Talisman on single repo
data = from(bucket: "daily-aggregate")
|> range(start: -1y)
|> filter(fn: (r) => r["_measurement"] == "ticks")
|> filter(fn: (r) => r["product"] == "AGUX/USD")
|> window(every: 1y)
max = data
|> filter(fn: (r) => r["_field"] == "max")
|> max()
from(bucket: "local")
|> range(start: -1y)
|> filter(fn: (r) => r["_measurement"] == "ticks")
|> filter(fn: (r) => r["_field"] == "price")
|> filter(fn: (r) => r["product"] == "AGUX/USD")
|> aggregateWindow(every: 1y, fn: max, createEmpty: false)
|> yield(name: "max")
from(bucket: "local")
|> range(start: -1y)
from(bucket: "local")
|> range(start: -37d, stop: now())
|> filter(fn: (r) => r["_measurement"] == "ticks")
|> filter(fn: (r) => r["_field"] == "price")
|> filter(fn: (r) => r["product"] == "AGUX/USD")
|> window(period: 1h)
|> first()
|> yield(name: "first")
from(bucket: "local")
|> range(start: -30d, stop: now())
|> filter(fn: (r) => r["_measurement"] == "ticks")
|> filter(fn: (r) => r["_field"] == "price")
|> filter(fn: (r) => r["product"] == "AGUX/USD")
|> window(period: 1h)
|> first()
|> yield(name: "first")