返回

FastAPI 客户端数据处理:使用 Base 模型解决数据转换问题

python

使用 Base 模型处理 FastAPI 客户端数据

问题

在使用 FastAPI 创建 API 时,有时会遇到无法使用 JSON 字典创建 Base 模型来接受客户端数据的困境。为了解决这个问题,我们需要一个将 JSON 字典转换为 pydantic 模型的方法,并了解 FastAPI 服务器端验证和处理模型的正确方法。

解决方法

要解决这一问题,我们可以遵循以下步骤:

  1. 将 JSON 字典转换为 Pydantic 模型: 使用 Pydantic,可以轻松地将 JSON 字典转换为具有适当类型的验证模型。这确保了接收的数据符合模型的定义。
  2. 使用 POST 请求: 使用 POST 方法发送模型,而不是 GET 方法。POST 方法用于创建新资源,而 GET 方法用于获取数据。
  3. 设置请求头: 设置适当的请求头,包括 Content-Type: application/json,以告知服务器数据格式为 JSON。
  4. 验证模型: 在服务器端,使用 Pydantic 验证模型是否有效,并引发异常来处理无效数据。
  5. 处理模型: 在服务器端处理接收到的模型,执行必要的操作并返回适当的响应。

代码示例

以下是客户端和服务器端的代码示例,展示了如何处理此问题:

客户端代码:

import json

dic = {'name': 'Mariner', 'deviceType': 'iPhone 13 Pro', 'latitude': 12.12455, 'longitude': -27.4545622, 'batteryLevel': 28.0, 'positionType': 'Wifi', 'timestamp': 1710790939.373}

from pydantic import BaseModel
class DeviceLocation(BaseModel):
    name: str
    deviceType: str
    latitude: float
    longitude: float
    batteryLevel: float
    positionType: str
    timestamp: float

item = DeviceLocation(**dic)

headers = {'Content-Type': 'application/json'}

import requests
response = requests.post('http://localhost:8000/logger/publish_data/', headers=headers, json=item.dict())
print(response.status_code)

服务器端代码:

from fastapi import FastAPI, Depends
from fastapi.responses import JSONResponse
from pydantic import BaseModel, Field

app = FastAPI()

class DeviceLocation(BaseModel):
    name: str = Field(...)
    deviceType: str = Field(...)
    latitude: float = Field(...)
    longitude: float = Field(...)
    batteryLevel: float = Field(...)
    positionType: str = Field(...)
    timestamp: float = Field(...)

@app.post("/logger/publish_data/")
async def save_current_whereabouts(item: DeviceLocation):
    try:
        item.validate()
    except pydantic.error_wrappers.ValidationError as e:
        return JSONResponse(content={'error': 'Invalid data'}, status_code=400)

    print(item)
    return JSONResponse(content={'status': 'success'}, status_code=200)

结论

通过使用 Pydantic 将 JSON 字典转换为模型、使用正确的请求方法、设置适当的请求头、验证模型并在服务器端处理模型,我们可以有效地处理 FastAPI 客户端数据。本文提供了一个全面的指南来解决这个问题,帮助开发者创建强大的 API。

常见问题解答

1. 为什么使用 Pydantic?
使用 Pydantic 可以轻松创建验证数据模型,确保接收的数据符合预期格式。

2. 如何设置请求头?
在发送模型的请求中,设置 Content-Type: application/json 头,以告知服务器数据格式为 JSON。

3. 如何处理无效模型?
在服务器端,使用 try/except 块来捕获无效模型的验证错误,并返回适当的错误响应。

4. 如何返回成功的响应?
在服务器端处理模型后,返回一个 HTTP 200 响应,指示数据已成功处理。

5. 如何查看模型?
在服务器端打印接收到的模型,以检查是否已成功创建。