FastAPI 是一个基于 Python 的 Web 框架,用于创建 API 服务。它是一个支持异步作的现代、快速、高性能的框架。
在本教程中,您将学习如何在 Ubuntu 24.04 上安装带有 MongoDB 的 FastAPI。您还将学习如何使用 FastAPI 和 MongoDB 数据库通过 CRUD作创建您的第一个 API。
要开始阅读本指南,请确保您具备以下条件:
在创建新的 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
安装 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
现在您已经创建并激活了 Python 虚拟环境,让我们安装 FastAPI 并创建项目结构。
使用 pip3 命令,执行它以安装 fastapi 和 uvicorn 包。
pip3 install fastapi uvicorn
安装完成后,使用以下命令创建新文件和目录。
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!"}
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)
运行您的 FastAPI 项目
现在你的项目已经准备好了,让我们运行你的第一个 FastAPI 项目。
按如下方式执行 'main.py' 脚本,您的 FastAPI 将在您的系统上运行。
python3 main.py
现在打开您的网络浏览器并访问 http://SERVERIP:8080/。如果你的安装成功,你将看到 'Hello FastAPI!' 消息。您也可以通过终端的 'curl' 访问它。
最后,您可以在 http://SERVERIP:8080/docs 上访问 API 文档>该文档由 Swagger UI 提供。
在本指南中,您将使用 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")
在本节中,您将通过 '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,
}
}
此时,您已经创建了与 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)
检索所有项目
其次,您将创建一个新函数 '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
根据 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."
更新项目
现在,您将创建一个用于更新项的新函数。您还可以通过 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
最后,您将创建“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."
此时,我们已经为 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
获取所有项目的路由
添加以下脚本以设置用于检索数据的路由。对根项目 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."
获取特定项目的路由
要获取特定项目的详细信息,我们将使用 '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."
用于更新项目的路径
复制以下代码以设置更新项的路由:
# 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"
删除项目的路径
插入以下行以创建用于删除项目的 '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.'}
服务器/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 终端节点将在以下位置可用:
首先,确保你的 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上安装和使用Nessus
下一条: 没有了