欢迎访问宙启技术站
智能推送

使用Starlette和数据库构建数据驱动的Web应用程序

发布时间:2024-01-17 01:18:30

Starlette是一个轻量级的异步Python Web框架,适用于构建高性能的数据驱动的Web应用程序。它提供了一组简单而强大的工具和功能,可以轻松地与数据库进行交互。

下面将演示如何使用Starlette和数据库构建一个简单的待办事项清单应用程序。

首先,我们需要安装Starlette和数据库驱动程序(在本例中使用SQLite):

pip install starlette
pip install databases
pip install pydantic

接下来,我们创建一个名为main.py的文件,并导入所需的库和模块:

from starlette.applications import Starlette
from starlette.responses import HTMLResponse, JSONResponse
from starlette.routing import Route
from databases import Database
from pydantic import BaseModel

然后,我们连接到数据库并创建一个待办事项表:

database = Database("sqlite:///todo.db")

class Todo(BaseModel):
    id: int
    title: str
    completed: bool

async def startup():
    await database.connect()
    query = "CREATE TABLE IF NOT EXISTS todos (id INTEGER PRIMARY KEY, title TEXT, completed BOOLEAN);"
    await database.execute(query)

async def shutdown():
    await database.disconnect()

async def get_todos():
    query = "SELECT * FROM todos;"
    result = await database.fetch_all(query)
    todos = [Todo(**row) for row in result]
    return todos

在上面的代码中,我们创建了一个Todo模型来表示待办事项的属性,然后使用databases库连接到SQLite数据库,并创建了一个todos表。我们还定义了一个get_todos函数,该函数用于从数据库中检索所有待办事项。

接下来,我们需要定义一些路由来处理HTTP请求:

async def home(request):
    return HTMLResponse("""
        <html>
            <head>
                <title>Todo List</title>
            </head>
            <body>
                <h1>Todo List</h1>
                <ul>
                    {todos}
                </ul>
            </body>
        </html>
    """)

async def todos(request):
    todos = await get_todos()
    return JSONResponse([todo.dict() for todo in todos])

async def add_todo(request):
    todo = await request.json()
    query = "INSERT INTO todos (title, completed) VALUES (:title, :completed);"
    values = {"title": todo["title"], "completed": todo["completed"]}
    await database.execute(query, values)
    return JSONResponse({"message": "Todo added successfully"})

app = Starlette(routes=[
    Route("/", endpoint=home),
    Route("/todos", endpoint=todos),
    Route("/add_todo", endpoint=add_todo, methods=["POST"]),
], on_startup=[startup], on_shutdown=[shutdown])

在上面的代码中,我们定义了三个路由:home用于返回待办事项清单的HTML页面,todos用于返回所有待办事项的JSON响应,add_todo用于将待办事项添加到数据库中。

最后,我们启动应用程序:

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="localhost", port=8000)

完成以上步骤后,我们就可以运行应用程序,并使用curl或浏览器访问http://localhost:8000来测试应用程序。

使用curl发送POST请求来添加一个待办事项:

curl -X POST -H "Content-Type: application/json" -d '{"title": "Buy milk", "completed": false}' http://localhost:8000/add_todo

使用curl或浏览器访问http://localhost:8000/todos来获取所有待办事项的列表。

这只是一个简单的示例,演示了如何使用Starlette和数据库构建数据驱动的Web应用程序。您可以根据自己的需求扩展和定制此示例。