0. 接口 import uvicorn from typing import List from fastapi import FastAPI, File, UploadFile import asyncio app = FastAPI() @app.post("/send_one_image") async def update_item(file: UploadFile = File(...),label:str=Form(None)): with open(f'{file.filename}.jpg','wb') as f: f.write(await file.read()) return {"res": '接收成功'} @app.post("/send_images") async def update_item(files: List[UploadFile] = File(...),label:str=Form(None)): lists = [i.filename for i in files] print(lists) count = 0 for i in files: with open(f'{count}.jpg','wb') as f: f.write(await i.read()) count += 1 return {"res": len(files)} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=9315)
1.python 上传多个文件
1.1
pip install requests_toolbelt
from requests_toolbelt.multipart.encoder import MultipartEncoder list_urls = ['https://sun9-63.userapi.com/c638920/v638920705/1a54d/xSREwpakJD4.jpg', 'https://sun9-28.userapi.com/c854024/v854024084/1160d8/LDMVHYgguAw.jpg', 'https://sun9-54.userapi.com/c854220/v854220084/111f66/LdcbEpPR6tg.jpg', 'https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg'] headers0={ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36' } fields = [("files",(i.split('/')[-1],requests.get(i,headers=headers0).content)) for i in list_urls] #fields.append(("boundary","--WebKitFormBoundary9K7xUkVGzyQA6e6h")) multipart_encoder = MultipartEncoder(fields) headers2 = {"Content-Type": multipart_encoder.content_type} resp = requests.post("http://127.0.0.1:9315/send_images", headers=headers2, data=multipart_encoder) print(resp.text)
1.2 上传多个文件并提交表单
list_urls = ['https://sun9-63.userapi.com/c638920/v638920705/1a54d/xSREwpakJD4.jpg', 'https://sun9-28.userapi.com/c854024/v854024084/1160d8/LDMVHYgguAw.jpg', 'https://sun9-54.userapi.com/c854220/v854220084/111f66/LdcbEpPR6tg.jpg', 'https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg'] headers0 = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36' } fields = [("files", (i.split('/')[-1], requests.get(i, headers=headers0).content)) for i in list_urls] data = {"label":"上传表单"} response = requests.post('http://127.0.0.1:9315/send_images',files=fields,data=data) print(response.text)
2. 接收单个文件
image_url='https://sun9-40.userapi.com/c841420/v841420283/4c8bb/Mii6GSCrmpo.jpg'
files={'file':(image_url.split('/')[-1],requests.get(image_url,headers=headers0).content))}
data={'label':'文件'}
res = requests.post('http://127.0.0.1:9315/send_one_image',data=data,files=files)
print(res.text)
3. 接收列表数据
from typing import Optional, Union, List, Dict from fastapi import FastAPI, File, UploadFile, Form from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel
class Test_Api(): def createOrder(self, orders): for params in orders: order_no_list = params.order_nos store_name = params.store_name
method_name_dic = { "createOrder": Test_Api().createOrder } app = FastAPI() app.add_middleware( # 防止跨域 CORSMiddleware, # allow_origins=origins, # 表示允许任何源 allow_origins=["*"], # 表示允许任何源 allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) class Item(BaseModel): store_name: str = None order_nos: List = None class GraphList(BaseModel): data: List[Item] method_name: str = None @app.post('/create_order') async def search(item: GraphList): data = item.data # 接收类下的方法名 method_name = "createOrder" try: loop = asyncio.get_event_loop() method_ = method_name_dic[method_name] result_data = await loop.run_in_executor(None, method_, data) return result_data except: return {"errcode": 0, "errmsg": "error"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8090)#调用
url = 'http://127.0.0.1:8090/create_order' import requests data = {'data': [ {"store_name": "xxxx", "order_nos": ["xxxx","xxxx" ]}, {"store_name": "xxxx","purchase_order_nos": ["xxxx","xxxx"]} ] } res = requests.post(url, data=json.dumps(data)) print(res.text)
4. 接收列表参数的几种格式
from typing import List
from pydantic import BaseModel
class Item(BaseModel):
name: str
class ItemList(BaseModel):
items: List[Item]
def process_item_list(items: ItemList):
pass
这个例子将能够像解析 JSON:{"items": [{"name": "John"}, {"name": "Mary"}]}
在您的情况下 - 取决于您的列表条目的形状 - 您还需要进行适当的类型建模,但您希望直接接收和处理列表,而无需围绕它的 JSON dict 包装器。你可以去:
from typing import List
from pydantic import BaseModel
class Item(BaseModel):
name: str
def process_item_list(items: List[Item]):
pass
现在能够处理 JSON,如: [{"name": "John"}, {"name": "Mary"}]
如果是普通字符串,您还可以选择:
from typing import List
@app.post('/get_name')
def process_item_list(items: List[str]):
print('items:', items)
可以像处理 JSON:["John", "Mary"]
调用:
def get_name(): url = 'http://127.0.0.1:8090/get_name' import requests res = requests.post(url, data=json.dumps(["John", "Mary"])) print(res.text)