113 lines
3.2 KiB
Python
113 lines
3.2 KiB
Python
"""
|
|
Example Starlette application for PyServe ASGI mounting.
|
|
|
|
This demonstrates how to create a Starlette application that can be
|
|
mounted at a specific path in PyServe.
|
|
"""
|
|
|
|
try:
|
|
from starlette.applications import Starlette
|
|
from starlette.responses import JSONResponse
|
|
from starlette.routing import Route
|
|
from starlette.requests import Request
|
|
except ImportError:
|
|
raise ImportError(
|
|
"Starlette is not installed. Install with: pip install starlette"
|
|
)
|
|
|
|
|
|
tasks_db = {
|
|
1: {"id": 1, "title": "Task 1", "completed": False},
|
|
2: {"id": 2, "title": "Task 2", "completed": True},
|
|
}
|
|
|
|
|
|
async def homepage(request: Request) -> JSONResponse:
|
|
return JSONResponse({
|
|
"message": "Welcome to Starlette mounted in PyServe!"
|
|
})
|
|
|
|
|
|
async def health_check(request: Request) -> JSONResponse:
|
|
return JSONResponse({"status": "healthy", "app": "starlette"})
|
|
|
|
|
|
async def list_tasks(request: Request) -> JSONResponse:
|
|
return JSONResponse({
|
|
"tasks": list(tasks_db.values()),
|
|
"count": len(tasks_db)
|
|
})
|
|
|
|
|
|
async def get_task(request: Request) -> JSONResponse:
|
|
task_id = int(request.path_params["task_id"])
|
|
if task_id not in tasks_db:
|
|
return JSONResponse({"error": "Task not found"}, status_code=404)
|
|
return JSONResponse(tasks_db[task_id])
|
|
|
|
|
|
async def create_task(request: Request) -> JSONResponse:
|
|
data = await request.json()
|
|
if not data or "title" not in data:
|
|
return JSONResponse({"error": "Title is required"}, status_code=400)
|
|
|
|
new_id = max(tasks_db.keys()) + 1 if tasks_db else 1
|
|
tasks_db[new_id] = {
|
|
"id": new_id,
|
|
"title": data["title"],
|
|
"completed": data.get("completed", False),
|
|
}
|
|
return JSONResponse(
|
|
{"message": f"Task created with ID {new_id}", "task": tasks_db[new_id]},
|
|
status_code=201
|
|
)
|
|
|
|
|
|
async def update_task(request: Request) -> JSONResponse:
|
|
task_id = int(request.path_params["task_id"])
|
|
if task_id not in tasks_db:
|
|
return JSONResponse({"error": "Task not found"}, status_code=404)
|
|
|
|
data = await request.json()
|
|
if data:
|
|
if "title" in data:
|
|
tasks_db[task_id]["title"] = data["title"]
|
|
if "completed" in data:
|
|
tasks_db[task_id]["completed"] = data["completed"]
|
|
|
|
return JSONResponse({
|
|
"message": f"Task {task_id} updated",
|
|
"task": tasks_db[task_id]
|
|
})
|
|
|
|
|
|
async def delete_task(request: Request) -> JSONResponse:
|
|
task_id = int(request.path_params["task_id"])
|
|
if task_id not in tasks_db:
|
|
return JSONResponse({"error": "Task not found"}, status_code=404)
|
|
|
|
del tasks_db[task_id]
|
|
return JSONResponse({"message": f"Task {task_id} deleted"})
|
|
|
|
|
|
routes = [
|
|
Route("/", homepage),
|
|
Route("/health", health_check),
|
|
Route("/tasks", list_tasks, methods=["GET"]),
|
|
Route("/tasks", create_task, methods=["POST"]),
|
|
Route("/tasks/{task_id:int}", get_task, methods=["GET"]),
|
|
Route("/tasks/{task_id:int}", update_task, methods=["PUT"]),
|
|
Route("/tasks/{task_id:int}", delete_task, methods=["DELETE"]),
|
|
]
|
|
|
|
app = Starlette(debug=True, routes=routes)
|
|
|
|
|
|
def create_app(debug: bool = False) -> Starlette:
|
|
return Starlette(debug=debug, routes=routes)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
uvicorn.run(app, host="0.0.0.0", port=8003)
|