帮助中心
如何在Ubuntu 24.04上使用MongoDB安装FAST API

如何在Ubuntu 24.04上使用MongoDB安装FAST API


FastAPI 是一个基于 Python 的 Web 框架,用于创建 API 服务。它是一个支持异步作的现代、快速、高性能的框架。


在本教程中,您将学习如何在 Ubuntu 24.04 上安装带有 MongoDB 的 FastAPI。您还将学习如何使用 FastAPI 和 MongoDB 数据库通过 CRUD作创建您的第一个 API。


先决条件


要开始阅读本指南,请确保您具备以下条件:


  • Ubuntu 24.04 系统
  • 具有管理员权限的非 root 用户


安装 MongoDB


在创建新的 FastAPI 项目之前,让我们将 MongoDB 服务器安装到我们的系统中。


首先,运行下面的命令来更新你的软件包索引,并将 'gnupg' 和 'curl' 安装到你的系统中。

sudo apt update && sudo apt install gnupg curl -y

执行以下命令以添加 MongoDB 服务器的 GPG 密钥。

curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
--dearmor

使用以下命令添加 MongoDB 存储库。

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

添加存储库后,运行以下命令以刷新包索引并安装 MongoDB 服务器。输入 'Y' 以确认安装。

sudo apt update && sudo apt install mongodb-org



安装完成后,启动并启用 MongoDB 服务“mongod”服务,然后检查您的 MongoDB 服务状态以确保它正在运行。

sudo systemctl enable --now mongod
sudo systemctl status mongod




除此之外,您还可以使用下面的“mongosh”命令登录到 MongoDB 服务器。要退出,请按 Ctrl+d。

mongosh


设置 Python 和虚拟环境


安装 MongoDB 后,您将安装 Python 包并设置项目目录和虚拟环境。


使用以下命令安装 Python、Pip 和 Venv 模块。输入 'Y' 以确认安装。

sudo apt install python3 python3-pip python3-venv



安装完成后,登录到您的用户。

su - username

现在创建一个新的 '~/app' 目录并移动到其中。此目录将用于存储你的 FastAPI 项目。

mkdir -p ~/app; cd ~/app

执行以下命令以创建新的 'venv' 虚拟环境并激活它。这样,你的 shell 提示符就会变成 '(venv) user@hostname'。

python3 -m venv .venv
source .venv/bin/activate



从这里开始,您的工作环境必须位于 'venv' 虚拟环境中。您可以使用以下命令从 'venv' 注销。

deactivate


创建 FastAPI 项目


现在您已经创建并激活了 Python 虚拟环境,让我们安装 FastAPI 并创建项目结构。


使用 pip3 命令,执行它以安装 fastapi 和 uvicorn 包。

    pip3 install fastapi uvicorn
    • “fastapi”是用于在 Python 中构建 API 的主要 FastAPI Web 框架
    • “uvicorn”是 Python 中 ASGI(异步服务器网关接口)Web 服务器的实现。

    安装完成后,使用以下命令创建新文件和目录。

    mkdir -p server/{models,routes}
    touch main.py server/{app.py,database.py} server/models/itemModels.py server/routes/item.py

    下面是我们的 FastAPI 项目结构。



    服务器/app.py


    现在你的项目已经准备好了,让我们修改 'server/app.py' 文件,这是你的 FastAPI 项目的主要应用程序。


    使用文本编辑器打开“app.py”文件,然后复制以下脚本。

    from fastapi import FastAPI

    app = FastAPI()

    @app.get("/")
    async def root():
    return {"message": "Hello FastAPI!"}
    • 将 FastAPI 模块导入到你的项目中,并将其绑定到 'app' 变量
    • 创建一个新的 'root' 函数,返回 'Hello FastAPI!'
    • 'root' 函数响应根 URL 上的 GET 方法
    • 'async' 将你的函数标记为异步函数,并且在调用时可能会在其主体中使用 'await'


    main.py


    在本节中,我们将修改 'main.py' 文件,该文件将用于通过 'uvicorn'(Python 中的 ASGI Web 服务器)运行 FastAPI 项目。


    现在打开并修改 'main.py' 脚本并插入以下代码。


    import uvicorn

    if __name__ == "__main__":
    uvicorn.run("server.app:app", host="0.0.0.0", port=8080, reload=True)
    • 导入 'uvicorn' 模块
    • 当 'main.py' 脚本被执行时,它将在 'server/app.py' 中加载 'app' 或 FastAPI 模块
    • FastAPI 将在端口为 '8080' 的 '0.0.0.0' 上运行
    • 通过 'reload=True' 启用代码更改时自动重新加载


    运行您的 FastAPI 项目


    现在你的项目已经准备好了,让我们运行你的第一个 FastAPI 项目。


    按如下方式执行 'main.py' 脚本,您的 FastAPI 将在您的系统上运行。

    python3 main.py



    现在打开您的网络浏览器并访问 http://SERVERIP:8080/。如果你的安装成功,你将看到 'Hello FastAPI!' 消息。您也可以通过终端的 'curl' 访问它。


    最后,您可以在 http://SERVERIP:8080/docs 上访问 API 文档>该文档由 Swagger UI 提供。




    将 FastAPI 连接到 MongoDB


    在本指南中,您将使用 FastAPI 和 MongoDB 创建一个基本的 API。您的 API 应该能够与 MongoDB 数据库服务器进行 CRUD。对于此步骤,您需要将项目连接到 MongoDB 服务器。


    首先,运行下面的 'pip3' 命令,将 'motor' MongoDB 驱动程序安装到您的项目中。'motor' 提供对 MongoDB 服务器的非阻塞和基于协程的 API 访问。

    pip3 install motor


    服务器/database.py


    安装 'motor' 模块后,我们修改 'server/database.py' 脚本。


    使用文本编辑器打开 'server/database.py' 文件并输入以下脚本。这将用于通过 'motor' 模块连接到 MongoDB 服务器。


    from motor.motor_asyncio import AsyncIOMotorClient

    MONGODB_HOST = "mongodb://localhost:27017"

    connection = AsyncIOMotorClient(MONGODB_HOST)

    database = connection.items
    item_collection = database.get_collection("item_collection")
    • 从 'motor.motor_asyncio' 导入 'AsyncIOMotorClient'
    • 创建一个新的常量 'MONGODB_HOST' 并指向 MongoDB 服务器 'mongodb://localhost:27017'
    • 通过 'connection' 变量连接到 MongoDB 服务器
    • 通过 'database' 变量连接到数据库 'items'
    • 使用 'item_collection' 变量访问数据库上的集合


    使用 pydantic 创建数据库模型


    在本节中,您将通过 'pydantic' 设计数据,它为我们的 MongoDB 数据库提供建模。


    使用下面的 'pip3' 命令安装 'pydantic' 模块。'pydantic' 模块是一个数据验证库,允许您通过模型创建数据库模式。

    pip3 install pydantic

    现在用文本编辑器打开 'server/models/itemModels.py' 文件并复制以下脚本。

    from pydantic import BaseModel, Field
    from typing import Optional

    class Item(BaseModel):
    name: str
    category: str
    stocks: int
    price: int = Field(gt=0)

    class Config:
    json_schema_extra = {
    "example": {
    "name": "Company Smart Watch",
    "category": "smartwatch",
    "stocks": 10,
    "price": 1000,
    }
    }

    class ItemUpdate(BaseModel):
    name: Optional[str] = None
    category: Optional[str] = None
    stocks: Optional[int] = None
    price: Optional[int] = None

    class Config:
    json_schema_extra = {
    "example": {
    "name": "New Smart watch",
    "category": "new-smartwatch",
    "stocks": 5,
    "price": 500,
    }
    }
    • 从 'pydantic' 导入 'BaseModel' 和 'Field' 模块
    • 从 'typing' 导入 'Optional' 模块
    • 为 FastAPI 创建以下 'Item' 数据库架构:
    • 类型为 string 的 'name' 和 'category'
    • 'stocks' 和 'price' 类别为 integer
    • 'price' 必须大于 0
    • 通过提供用户可以包含在请求中的数据示例,通过 'Config' 类扩展数据模型
    • 创建以下 'ItemUpdate' 架构,并将每个字段都作为可选字段。


    添加 CRUD作


    此时,您已经创建了与 MongoDB 服务器的连接,并通过 'pydantic' 创建了数据库架构。让我们继续使用 FastAPI 和 MongoDB 创建 CRUD作。


    再次打开 'server/database.py' 脚本并创建一个类型为 'dict' 的新函数 'item_helper'。调用此函数可获取有关项目的详细数据。

    def item_helper(item) -> dict:
    return {
    "id": str(item["_id"]),
    "name": item["name"],
    "category": item["category"],
    "stocks": item["stocks"],
    "price": item["price"],
    }

    添加以下行以从 'bson.objectid' 导入 'ObjectId' 模块。“ObjectId”是 BSON 中数据类型的一部分,MongoDB 使用它来存储和表示 JSON 数据。

    from bson.objectid import ObjectId

    创建项


    首先,您将创建一个异步函数,该函数将能够将新数据添加到 MongoDB 数据库。


    创建一个新函数 'add_item',如下所示:

    # Add a new item
    async def add_item(item_details: dict) -> dict :
    item = await item_collection.insert_one(item_details)
    new_item = await item_collection.find_one({"_id": item.inserted_id})
    return item_helper(new_item)
    • 'add_item' 函数接受商品详情的字典数据
    • 通过 'item_collection' 访问数据库中的文档并执行 'insert_one' 查询以添加新项目
    • 作成功后,新项目将被打印出来


    检索所有项目


    其次,您将创建一个新函数 'get_items',该函数将能够检索数据库中的所有可用项目。


    创建一个新函数 'get_items' 用于从 MongoDB 中检索所有项目。

    # retrieve all items
    async def get_items():
    items = []
    async for item in item_collection.find():
    items.append(item_helper(item))
    return items
    • 您将创建一个空的 'items' 列表
    • 使用 'find()' 查询搜索所有数据并循环遍历它
    • 每个项目都将通过 'append' 方法添加到 'items' 列表中
    • 循环完成后,您的物品将显示


    根据 id 检索特定项目


    接下来,您将创建一个新函数,该函数将能够检索特定选择器 'id' 的数据。这将向您显示特定项目的详细信息数据。


    创建一个新函数 'get_item' 函数来检索特定项目的数据。'get_item' 函数将接受 'id' 的字符串作为选择器并返回一个字典。

    # retrieve specific item
    async def get_item(id: str) -> dict:
    item = await item_collection.find_one({"_id": ObjectId(id)})
    if item:
    return item_helper(item)
    return "Item Not Found."
    • 'find_one()' 查询将用于根据 'id' 检索数据
    • 如果找到项目,详细信息将使用 'item_helper' 字典格式显示
    • 如果项目不可用,则响应为“未找到项目”


    更新项目


    现在,您将创建一个用于更新项的新函数。您还可以通过 API 部分更新您的商品。


    定义新函数 'change_item' ,如以下代码所示:

    # update item
    async def change_item(id: str, data: dict):
    if len(data) < 1:
    return "Please input your data"
    find_item = await item_collection.find_one({"_id": ObjectId(id)})
    if find_item:
    item_update = await item_collection.update_one({"_id": ObjectId(id)}, {"$set": data})
    if item_update:
    return True
    return False
    • 'change_item' 函数接受两个参数,目标项目的 'id' 和作为新数据的 'data'
    • 如果 data 为空或“< 1”,则作终止
    • 此函数将根据 'id' 选择器查找项目
    • 如果找到 'id',则执行 'item_update'
    • 如果 'item_update' 成功,则返回 'True',否则返回 'False'


    删除项目


    最后,您将创建“delete_item”函数,用于通过特定选择器删除项目。


    要删除项目,我们将创建 'delete_item' 函数并使用 'id' 选择器,如下所示:

    # delete an item
    async def delete_item(id: str):
    item = await item_collection.find_one({"_id": ObjectId(id)})
    if item:
    await item_collection.delete_one({"_id": ObjectId(id)})
    return(f'Item {id} deleted.')
    return "Item Not Found."
    • 'find_one()' 查询将根据提供的 'id' 搜索项目
    • 如果找到项目,将通过 'delete_one()' 查询将其删除,并返回 '项目 ID 已删除'
    • 如果项目不可用,则会显示“未找到项目”


    为 CRUD作添加路由


    此时,我们已经为 FastAPI 的 CRUD作创建了异步函数。现在,让我们为每个作创建路由或终端节点。


    使用你喜欢的编辑器编辑 'server/routes/item.py' 文件。


    服务器/路由/item.py


    首先,从 fastapi 中添加 APIRouter 和 Body。然后,从 'fastapi.encoders' 添加 'jsonable_encode”。

    from fastapi import APIRouter, Body
    from fastapi.encoders import jsonable_encoder

    从 'database.py' 文件导入每个函数。

    from server.database import (
    add_item,
    get_items,
    get_item,
    change_item,
    delete_item,
    )

    从 'itemModels.py' 文件导入 'Item' 和 'ItemUpdate' 模型。

    from server.models.itemModels import (
    Item,
    ItemUpdate,
    )

    通过 'router' 变量调用 'APIRouter' 类。

    router = APIRouter()

    添加新项的路径


    现在让我们添加一个用于添加新项目的路由。在此示例中,您可以通过 POST 将新项目添加到“/item”URL。


    添加以下行以设置用于添加新项目的路由。对项目的根 URL 的每个 POST 都将被视为插入新数据。

    # add new item operation
    @router.post("/")
    async def add_item_data(item: Item = Body(...)):
    item = jsonable_encoder(item)
    new_item = await add_item(item)
    return new_item
    • 'add_item_data' 函数接受 'Item' 架构,该架构将成为您请求的 'Body' 的一部分
    • 您的商品将通过 'jsonable_encoder' 转换为字典格式
    • 通过 'add_item' 函数(参见 database.py)将词典数据插入 'new_item' 变量的顶部
    • 将插入的数据作为响应返回 'new_item'


    获取所有项目的路由


    添加以下脚本以设置用于检索数据的路由。对根项目 URL 的每个 GET 请求都将检索您的所有数据。

    # get all available items
    @router.get("/")
    async def get_item_data():
    items = await get_items()
    if items:
    return items
    return "No available item."
    • 创建 'get_item_data' 函数,该函数将从 'database.py' 文件中执行 'get_item' 函数
    • 如果有商品,您将获得所有商品的列表
    • 如果没有商品,您将收到 'No available item' 响应


    获取特定项目的路由


    要获取特定项目的详细信息,我们将使用 'id' 作为选择器。对 '/id' 的每个 GET 请求都将返回所请求的 'id' 的详细项目。

    # Show details of the item via the id
    @router.get("/{id}")
    async def get_item_details(id):
    item_details = await get_item(id)
    if item_details:
    return item_details
    return "Item not found."
    • 将创建 'get_item_details' 函数并从 URL 传递 'id'
    • 将调用 'get_item' 函数(参见 database.py),并将 'id' 作为参数传递
    • 如果找到该项目,将显示该项目的详细信息
    • 如果没有具有该特定 'id' 的项目,你将收到 'Item not found'


    用于更新项目的路径


    复制以下代码以设置更新项的路由:

    # Update Item
    @router.put("/{id}")
    async def update_item(id: str, data: ItemUpdate = Body(...)):
    data = {k: v for k, v in data.dict().items() if v is not None}
    updated_item = await change_item(id, data)
    if updated_item:
    return{f'Success: item {id} updated.'}
    return "Error"
    • 'update_item' 函数将采用两个参数,'id' 作为选择器,'data' 基于 'ItemUpdate' 模型
    • 将在 'data' 变量中检查数据
    • 'updated_item' 将从 'database.py' 文件中执行 'change_item' 函数
    • 如果更新成功,您将看到输出 'Success'


    删除项目的路径


    插入以下行以创建用于删除项目的 'remove_item' 函数。对特定 '/id' 的每个 DELETE作都将删除与 'id' 匹配的项目。

    # delete item via id
    @router.delete("/{id}")
    async def remove_item(id):
    item_to_delete = await delete_item(id)
    if item_to_delete:
    return item_to_delete
    return{f'Item {id} Not Available.'}
    • 'remove_item' 函数将执行 'delete_item' 并传递 'id' 选择器
    • 删除作将通过 'item_to_delete' 变量存储和执行
    • 当商品缺货时,您将收到“商品 ID 不可用”的回报


    服务器/app.py


    现在你已经完成了 'server/routes/item.py' 文件,让我们把它包含在 'server/app.py' 中。


    使用文本编辑器打开“app.py”文件。


    从 'server/routes/item.py' 文件导入 'router' 作为 'ItemRouter'。

    from server.routes.item import router as ItemRouter

    插入默认前缀为 '/item' 的 'ItemRouter'。CRUD作将通过 '/item' URL 处理。

    app.include_router(ItemRouter, tags=["Item"], prefix="/item")

    现在,您的 CRUD 终端节点将在以下位置可用:


    • 添加新项目:POST 到 '/item'
    • 检索所有项目:GET to '/item'
    • 检索特定项目:GET 到 '/item/id'。'id' 由 MongoDB 生成
    • 更新项目:PUT 到 '/item/id'
    • 删除项:DELETE 到 '/item/id'


    测试 CRUD作


    首先,确保你的 FastAPI 项目正在运行,或者你可以执行如下所示的 'main.py' 脚本:

    python3 main.py

    浏览 http://SERVERIP:8080/docs,您将看到您创建的每条路线。



    以下是添加新项目的示例。



    通过 API 检索所有可用项目。




    通过 'id' 选择器检索特定项目。




    更新特定项目的部分数据。




    以下是更新后的数据。




    下面是通过 'id' 选择器进行的删除作。




    结论


    祝贺!您已完成在 Ubuntu 24.04 上使用 MongoDB 安装 FastAPI。您还学习了如何使用“motor”模块将 FastAPI 连接到 MongoDB,通过 “pydantic”创建数据模型,使用 FastAPI 创建 CRUD作,并学习如何为 API 创建端点。

    文章相关标签: Ubuntu 24.04 MongoDB FAST API

    上一条: 如何在Ubuntu 24.04上安装和使用Nessus

    下一条: 没有了

    购物车