python - 使用 FastAPI 将 json 数据传递到服务器的简约方法
问题描述
我正在尝试通过一些使用 FastAPI(使用 uvicorn)构建的简单 REST API 将一些 json 内容从客户端传递到服务器。如果我将文件内容包装成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 内容作为字符串传递给服务器,而无需将其包装到模型中?
解决方案
来自fastApi 文档:
如果不想使用 Pydantic 模型,也可以使用 Body 参数。请参阅正文的文档 - 多个参数:正文中的奇异值。
Body 的文档解释说,您可以使用默认值声明任何参数,Body(...)
以使其成为从 resquest 正文中检索的值。
这意味着您可以简单地删除您的 pydantic 模型并将您的write_file
函数声明更改为:
async def write_file(fn: str, contents=Body(...)):
...
但是,在我看来,这将是一个(非常)坏主意。FastApi 使用pydantic
模型来验证提供的数据并生成方便的 API 文档。我宁愿建议改进和开发pydantic
您使用的模型,以获得更好的自动验证和文档。
推荐阅读
- elasticsearch - Kibana Dashboard 上的趋势指标,这可能吗?
- android - 带有属性的运行时主题选择
- javascript - 路由的身份验证中间件不起作用
- java - 将 Hibernate createNativeQuery 与 TypedQuery 一起用于 Integer.class
- r - 处理别名变量的正确方法是什么?
- sql - 对具有不同值的两个字段进行分组,并按顺序选择特定值
- c++ - 在 switch 语句中将多个案例组合在一起
- r - 用 lapply 替换 for 循环
- javascript - AJAX 表单发布,即使它被禁用
- selenium - Selenium moveByOffset 不会将焦点移动到提供的坐标