如何解决如何在 FastAPI POST 请求中同时添加文件和 JSON 正文?
具体来说,我希望以下示例能够正常工作:
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>
#include <tuple>
#include <regex>
bool match(const std::string &pattern,const std::string &s) {
std::unordered_map<char,int> indexes;
std::ostringstream builder;
int ref = 1;
for (char c : pattern) {
if (auto backref = indexes.find(c); backref != indexes.end()) {
builder << '\\' << backref->second;
} else {
if (ref > 1) {
builder << "(?!";
for (int n = 1; n < ref; n += 1) {
if (n != 1) {
builder << '|';
}
builder << '\\' << n;
}
builder << ')';
}
builder << "(.)";
indexes.emplace(c,ref++);
}
}
// std::cout << builder.str() << '\n';
return std::regex_match(s,std::regex{builder.str()});
}
int main() {
std::tuple<std::string,std::string,bool> tests[] = {
{"AABB","CCDD",true},{"ABAB","CDCD",{"AAFFG","AAFGF",false},{"asdasd","qweqwe",{"abc","zzz",false}
};
std::cout << std::boolalpha;
for (const auto &[s1,s2,expected] : tests) {
if (match(s1,s2) == expected) {
std::cout << s1 << " => " << s2 << " = " << expected << ": PASS\n";
} else {
std::cout << s1 << " => " << s2 << " = " << (!expected) << ": FAIL\n";
}
}
return 0;
}
如果这不是 POST 请求的正确方式,请告诉我如何从 FastAPI 中上传的 CSV 文件中选择所需的列。
解决方法
您不能将表单数据与 json 混合使用。
每个 FastAPI documentation:
警告:
您可以在路径操作中声明多个 File
和 Form
参数,但您也不能声明您希望以 JSON 形式接收的 Body
字段,因为请求将具有使用 multipart/form-data
而不是 application/json
编码的正文。
这不是 FastAPI 的限制,而是 HTTP 协议的一部分。
但是,您可以使用 Form(...)
作为解决方法将额外的字符串附加为 form-data
:
from typing import List
from fastapi import FastAPI,UploadFile,File,Form
app = FastAPI()
@app.post("/data")
async def data(textColumnNames: List[str] = Form(...),idColumn: str = Form(...),csvFile: UploadFile = File(...)):
pass
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。