当前位置: 首页 > 知识库问答 >
问题:

如何使用FastAPI和Python请求传递字符串和多个文件?

丰辰沛
2023-03-14

我正在使用以下接受多个文件的FastAPIendpoint:

from fastapi import Request, FastAPI, File, UploadFile
from typing import List
import uvicorn

app = FastAPI()

@app.post("/multiplefiles")
async def _file_upload(keywords, files: List[UploadFile] = File(...)): #create_file
    return {"len_files": keywords}

我想先输入关键字参数,然后输入文件列表,但我找不到执行有效 post 请求的方法:

import requests

files = (("keywords", "key1"),
    [
    ('files', open('files\file1.pdf', 'rb')), 
    ('files', open('files\file2.pdf', 'rb'))
    ]
)

response = requests.post('http://127.0.0.1:3000/multiplefiles', files=files)
print(response.json())

如果我只上传文件作为元组工作列表,但我不知道如何传入关键字参数。

共有1个答案

尹光辉
2023-03-14

在endpoint中定义关键字参数的方式中,预计是查询参数。如果您希望它是单个字符串值,您可以使用str定义它,如下所示:

服务器端:

@app.post("/")
def upload(keywords: str, files: List[UploadFile] = File(...)):
    return {"keywords": keywords}

由于它应作为查询参数,因此应在 Python 请求中使用 params 参数,以便传递查询参数,如此处所述。例:

客户端:

url = 'http://127.0.0.1:8000/'
data = {'keywords': 'key1'}
r = requests.post(url, files=files, params=data)
print(r.json())

您也可以将其直接传递给URL:

url = 'http://127.0.0.1:8000?keywords=key1'

如果要发送关键字列表,则必须使用 List 类型(或 Python 3.9 中的 list声明关键字查询参数,并使用 Query 显式定义它,以便它可以接收值列表,或者换句话说,接收多个值 - 请参阅此处、此处和此处的相关答案(有关任意查询参数,请参阅此处和此处)。例:

服务器端:

from fastapi import Query

@app.post("/")
def upload(keywords: List[str] = Query(...), files: List[UploadFile] = File(...)):
    return {"keywords": keywords} 

客户端:

url = 'http://127.0.0.1:8000/'
data = {'keywords': ['key1', 'key2']}
r = requests.post(url, files=files, params=data)
print(r.json())

如果您想自己将关键字列表添加到URL的查询字符串中,则应该如下所示:

url = 'http://127.0.0.1:8000?keywords=key1&keywords=key2'

如果您想使用< code>Form参数来传递附加数据以及< code >文件,请看看这个答案。

 类似资料:
  • 如何使用改造发送请求字符串参数。我已经提交了下面的代码。这里如何添加字符串参数并发送到服务器。 应用配置: 公共类AppConfig{ ApiConfig: 服务器响应: 在上面的示例中,代码只是在请求主体的帮助下传递了令牌和文件。 如何用上面的代码发送请求字符串param 这就是如何使用改型将下面的登录参数详细信息作为请求参数发送。当我尝试时,我得到了/Throwable:com。谷歌。格森。流

  • 接口 单元测试 但是报错了 看了一下这个函数签名不支持 json 或者 data 参数 相比之下,requests 的 delete 是支持的传递 json 或者 data 的 怎么办?

  • 问题内容: 通过此链接:如何通过引用传递变量?我们知道,Python在将字符串(作为不可变类型变量)作为参数传递给函数时会复制它,但是我认为如果字符串很大,它将浪费内存。在许多情况下,我们需要使用函数来包装一些字符串操作,所以我想知道如何使其更有效? 问题答案: Python不会复制传递给函数的对象(包括字符串): 如果您需要“修改”函数中的字符串,请返回新字符串并将其分配回原始名称: 不幸的是,

  • 我正在尝试使用FastAPI MongoDB创建一个API,它可以从请求中返回多个值。MongoDB充满了数据,使用mongoengine,我可以在向特定endpoint发送请求时查阅一个或所有数据。我现在要做的是从endpoint接收一个或多个数据,例如: 当查询endpoint< code > http://127 . 0 . 0 . 1:8000/rice 时,我得到一个JSON响应,其中包

  • 我正在使用RestTemplate方法将请求发布到endpoint。我在不同的文件中有和,我想把它们传递给POST请求,除此之外,我还想把传递给endpoint。 我能够成功地传递头和请求,但不能传递包含凭据的Http实体 有没有办法让我三样东西都及格 > HttpHeader 要求 这是我的密码 以下代码位于NewHttpHeader中。包含和

  • 我正在使用FastAPI来提供一些ML模型,并且我有一个使用Python 模块的基本UI。 我的服务之一是通过POST请求获得图像,它就像一个魅力。 服务器端 {BASE_URI}/docs提供的卷曲 客户端使用Python请求 一旦我想添加额外的参数,它就变得令人毛骨悚然。例如: 服务器端 curl -- 由 {BASE_URI}/docs 给出 在那之前,一切正常。一旦我想使用Python<c