python - 发送 pathlib.Path 数据到 FastAPI : PosixPath is not JSON serializable

标签 python json fastapi pydantic

我已经使用 FastAPI 构建了一个 API,并尝试从客户端向它发送数据。

API 和客户端都对我要提交的数据使用类似的 Pydantic 模型。这包括一个包含文件路径的字段,我将其存储在 pathlib.path 类型的字段中。

但是,FastAPI 不接受提交,因为它显然无法处理路径对象:

TypeError:PosixPath 类型的对象不是 JSON 可序列化的

这是一个显示问题的最小测试文件:

import pathlib
from pydantic import BaseModel
from fastapi import FastAPI
from fastapi.testclient import TestClient


api = FastAPI()
client = TestClient(api)

class Submission(BaseModel):
    file_path: pathlib.Path

@api.post("/", response_model=Submission)
async def add_submission(subm: Submission):
    print(subm)
    # add submission to database
    return subm


def test_add_submission():
    data = {"file_path": "/my/path/to/file.csv"}
    print("original data:", data)

    # create a Submission object, which casts filePath to pathlib.Path:
    submission = Submission(**data)  
    print("submission object:", submission)

    payload = submission.dict()
    print("payload:", payload)

    response = client.post("/", json=payload)  # this throws the error
    assert response.ok

test_add_submission()

当我在客户端更改模型以使用字符串而不是 file_path 的路径时,事情就会发生。但是后来我失去了在创建 Submission 对象时将输入强制转换为 Path 的 pydantic 能力,然后拥有一个具有所有可能性的 Path 属性。当然,一定有更好的方法吗?

将 pathlib.PosixPath 对象作为负载的一部分发送到 FastAPI API 的正确方法是什么?

(这是 Python 3.8.9,fastapi 0.68.1,Ubuntu 上的 pydantic 1.8.2)

最佳答案

你的代码的问题是,你首先将 pydantic 模型转换成一个字典,然后将其传递给客户端,客户端使用它自己的 json 序列化器,而不是 pydantic 提供的序列化器。

submission.dict() 将任何 pydantic 模型转换为 dict 但保留任何其他数据类型。

使用client.post("/", json=payload) requests json序列化器,无法处理pathlib.Path

解决方法是,先不把pydantic模型转成dict,而是利用pydantic模型本身的json()方法传给客户端。

response = client.post("/", data=submission.json())

请注意,您必须将参数 json 更改为 data

关于python - 发送 pathlib.Path 数据到 FastAPI : PosixPath is not JSON serializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70183853/

相关文章:

python - __call__() 缺少 1 个必需的位置参数 : 'send' FastAPI on App Engine

FastAPI运行时错误: Use params or add_pagination

python - Pandas 数据框获取每组的第一行

Python:用遗传算法解决背包优化问题?

python - numpy.vectorize 返回不正确的值

android - 类 YYYY : does not exist. 的无参数构造函数向 Gson 注册一个 InstanceCreator 来解决这个问题”

java - LibGDX:使用皮肤为图像按钮着色图像

Sql 从另一个表的一组结果中以数组形式查询新列

python - fastapi 主体在两个函数之间表现不同

python - 如何在Python中查看USDT(Tether)的余额?