使用 FastAPI 将 json 数据传递到服务器的简约方式
minimalistic way to pass json data to server using FastAPI
我正在尝试通过某些方法将一些 json 内容从客户端传递到服务器
使用 FastAPI(使用 uvicorn)构建的简单 REST API。
如果我像这样将文件内容包装成 pydantic.BaseModel
app = FastAPI()
class ConfigContents(BaseModel):
str_contents: str
@app.post("/writeFile/{fn}")
async def write_file(fn: str, contents: ConfigContents):
filepath = "/some_server_dir/" + fn
with open(filepath, "w") as f:
f.write(contents.str_contents)
return contents
我基本上得到了我想要的,即在客户端(使用请求库),我可以执行
response = requests.post("http://127.0.0.1:8000/writeFile/my_file.json",
data=json.dumps({"str_contents": contents}))
并以分配给 response
的文件内容结束并写入“服务器”上的文件。
我的问题是:是否有更简单的方法来实现相同的目标,例如只是路过
json 内容作为字符串发送到服务器而不需要将其包装到模型中?
来自 the fastApi doc:
If you don't want to use Pydantic models, you can also use Body parameters. See the docs for Body - Multiple Parameters: Singular values in body.
The doc for Body 说明您可以使用 Body(...)
默认值声明任何参数,使其成为要从请求正文中检索的值。
这意味着您可以简单地删除您的 pydantic 模型并将您的 write_file
函数声明更改为:
async def write_file(fn: str, contents=Body(...)):
...
但是,在我看来,这将是一个(非常)糟糕的主意。 FastApi 使用 pydantic
模型来验证提供的数据并生成方便的 API 文档。
我宁愿建议改进和开发您使用的 pydantic
模型以获得更好的自动验证和文档。
我正在尝试通过某些方法将一些 json 内容从客户端传递到服务器
使用 FastAPI(使用 uvicorn)构建的简单 REST API。
如果我像这样将文件内容包装成 pydantic.BaseModel
app = FastAPI()
class ConfigContents(BaseModel):
str_contents: str
@app.post("/writeFile/{fn}")
async def write_file(fn: str, contents: ConfigContents):
filepath = "/some_server_dir/" + fn
with open(filepath, "w") as f:
f.write(contents.str_contents)
return contents
我基本上得到了我想要的,即在客户端(使用请求库),我可以执行
response = requests.post("http://127.0.0.1:8000/writeFile/my_file.json",
data=json.dumps({"str_contents": contents}))
并以分配给 response
的文件内容结束并写入“服务器”上的文件。
我的问题是:是否有更简单的方法来实现相同的目标,例如只是路过
json 内容作为字符串发送到服务器而不需要将其包装到模型中?
来自 the fastApi doc:
If you don't want to use Pydantic models, you can also use Body parameters. See the docs for Body - Multiple Parameters: Singular values in body.
The doc for Body 说明您可以使用 Body(...)
默认值声明任何参数,使其成为要从请求正文中检索的值。
这意味着您可以简单地删除您的 pydantic 模型并将您的 write_file
函数声明更改为:
async def write_file(fn: str, contents=Body(...)):
...
但是,在我看来,这将是一个(非常)糟糕的主意。 FastApi 使用 pydantic
模型来验证提供的数据并生成方便的 API 文档。
我宁愿建议改进和开发您使用的 pydantic
模型以获得更好的自动验证和文档。