| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 网络协议 -> 17.FastAPI 表单数据 -> 正文阅读 |
|
|
[网络协议]17.FastAPI 表单数据 |
17.FastAPI 表单数据如果接收的数据不是JSON格式,而是表单字段,则需要使用Form。在FastAPI中,要使用Form,需要事先安装python-multipart,执行如下命令: pip install python-multipart Form参数与Path、Query、Body一样,从fastapi导入。其使用方法相同。 17.1使用Form参数from fastapi import FastAPI
from fastapi import Form
?
app = FastAPI()
?
@app.post(path='/login')
async def login(uacc: str = Form(...), upwd: str = Form(...)):
? ?res = False
? ?if uacc == 'admin' and upwd == 'admin':
? ? ? ?res = True
? ?return {'res': res}
执行请求: curl -d "uacc=admin&upwd=123" -X POST http://127.0.0.1:8000/login
{"res":false}
curl -d "uacc=admin&upwd=admin" -X POST http://127.0.0.1:8000/login
{"res":true}
在使用Form参数时,需要注意:可以在一个路由操作中声明多个 Form 参数,但不能同时声明要接收 JSON 的 Body 字段。因为此时请求体的编码是 application/x-www-form-urlencoded,不是 application/json;这不是 FastAPI 的问题,而是 HTTP 协议的规定。 17.2使用File参数在web开发中,文件上传的需求是肯定会出现的,FastAPI通过多种方式支持文件上传操作。首先可以使用与Form、Body等相同的File,File直接继承自Form类。代码如下: from fastapi import FastAPI
from fastapi import File
?
app = FastAPI()
?
@app.post(path='/upload')
async def login(file: bytes = File(...)):
? ?with open('test.png', 'wb') as f:
? ? ? ?f.write(file)
? ?return {'file_size': len(file)}
执行请求: curl -F "file=@demo.png" -X POST http://127.0.0.1:8000/upload
{"file_size":10731}
通过查看项目所在文件夹,其下的test.png文件与demo.png文件相同。 在FastAPI中,声明文件体必须使用 File,否则,FastAPI 会把该参数当作查询参数或请求体(JSON)参数;文件作为表单数据上传;如果路由操作函数参数的类型声明为 bytes,FastAPI 将以 bytes 形式读取和接收文件内容,这种方式把文件的所有内容都存储在内存里,适用于小文件。所以,在大多数情况下,我们会使用 UploadFile。 17.3UploadFile类型定义 File 参数时使用 UploadFile 类型,UploadFile 的属性如下:
UploadFile 支持以下 async 方法:
因为上述方法都是 async 方法,要搭配 await 使用。 代码如下: from fastapi import FastAPI
from fastapi import File
from fastapi import UploadFile
?
app = FastAPI()
?
@app.post(path='/upload')
async def login(file: UploadFile = File(...)):
? ?with open('test.png', 'wb') as f:
? ? ? ?f.write(await file.read())
? ?return {'file_name': file.filename}
执行请求: curl -F "file=@demo.png" -X POST http://127.0.0.1:8000/upload
{"file_name":"demo.png"}
通过查看项目所在文件夹,其下的test.png文件与demo.png文件相同。 使用UploadFile与 bytes 相比,其优势:
17.4多文件上传FastAPI支持同时上传多个文件,可以使用一个表单字段上传多个文件,此时,路由操作函数要声明为包含bytes或UploadFile的列表。代码如下: from fastapi import FastAPI
from fastapi import File
from fastapi import UploadFile
from typing import List
?
app = FastAPI()
?
@app.post(path='/upload')
async def upload(files: List[bytes] = File(...)):
? ?sizes = [len(file) for file in files]
? ?index = 0
? ?for file in files:
? ? ? ?with open("{0}.png".format(index), 'wb') as f:
? ? ? ? ? ?f.write(file)
? ? ? ? ? ?index += 1
? ?return sizes
?
@app.post(path='/upload_file')
async def upload_file(files: List[UploadFile] = File(...)):
? ?names = [file.filename for file in files]
? ?for file in files:
? ? ? ?with open(file.filename, 'wb') as f:
? ? ? ? ? ?f.write(await file.read())
? ?return names
17.5同时请求表单与文件在FastAPI中,支持同时使用表单和文件。但可以在一个路径操作中声明 File 和 Form 参数,但不能同时声明要接收 JSON 的 Body 字段。因为此时请求体的编码是 multipart/form-data,不是 application/json。 from fastapi import FastAPI
from fastapi import Form
from fastapi import File
from fastapi import UploadFile
from typing import List
app = FastAPI()
@app.post(path='/upload')
async def upload(files: List[bytes] = File(...), desc: str = Form(...)):
print(desc)
sizes = [len(file) for file in files]
index = 0
for file in files:
with open("{0}.png".format(index), 'wb') as f:
f.write(file)
index += 1
return sizes
@app.post(path='/upload_file')
async def upload_file(files: List[UploadFile] = File(...), desc: str = Form(...)):
print(desc)
names = [file.filename for file in files]
for file in files:
with open(file.filename, 'wb') as f:
f.write(await file.read())
return names
执行请求: curl -F "desc=images" -F "files=@demo.png" -F "files=@elephant.png" -X POST http://127.0.0.1:8000/upload [10731,50279] curl -F "desc=images" -F "files=@demo.png" -F "files=@elephant.png" -X POST http://127.0.0.1:8000/upload_file ["demo.png","elephant.png"] 后台print输出: images INFO: 127.0.0.1:52608 - "POST /upload HTTP/1.1" 200 OK images INFO: 127.0.0.1:52611 - "POST /upload_file HTTP/1.1" 200 OK |
|
|
| 网络协议 最新文章 |
| 使用Easyswoole 搭建简单的Websoket服务 |
| 常见的数据通信方式有哪些? |
| Openssl 1024bit RSA算法---公私钥获取和处 |
| HTTPS协议的密钥交换流程 |
| 《小白WEB安全入门》03. 漏洞篇 |
| HttpRunner4.x 安装与使用 |
| 2021-07-04 |
| 手写RPC学习笔记 |
| K8S高可用版本部署 |
| mySQL计算IP地址范围 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/29 22:25:07- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |