参考内容:
Form Data
前面介绍的参数都是以json格式传递的,这节我们来介绍表单参数如何使用
如果要使用表单参数要先安装
python-multipart
pip install python-multipart
下面这个例子模拟了登陆的表单验证,我们可以看到,参数的声明没有用Body
或者Query
,而是用了Form
1 | from fastapi import FastAPI, Form |
打开http://127.0.0.1:8000/docs
,我们来看一下接口文档发生了哪些变化:
很明显的一点就是content-type发生了变化,变成了Content-Type: application/x-www-form-urlencoded
需要注意的一点是,如果我们同时使用了
Form
和Body
,请求将会以表单的形式发送给服务端
Request Files
介绍完表单,接下来介绍文件上传,在使用之前记得安装python-multipart
1 | from fastapi import FastAPI, File, UploadFile |
这里有两个接口,可以注意到file
接收的类型是不同的,那么这两种写法有什么区别呢:
- file是
bytes
类型时,fastapi会读取上传的文件,file参数将接收字节类型的内容,这也意味着全部内容将存储在内存中,如果文件很大的话,这并不是一个好的选择 - file是
UploadFile
类型时,相比bytes
类型来说,对大文件的处理更好一些,而且可以支持异步
UploadFile
接下来我们来仔细了解一下UploadFile
,为什么它相比bytes
来说更有优势,更适合大文件:
UploadFile
虽然也会读取文件到内存,但是当存储在内存的文件大小达到最大限制后,文件将会存储到硬盘中。这也就意味着它可以很好地用于大型文件,例如图像,视频,大型二进制文件等,而不会占用所有内存。我们通过
UploadFile
可以获取文件的相关属性,例如:- filename:上传的文件的文件名(例:myimage.jpg)
- content_type:文件类型(例:image/jpeg)
- file:SpooledTemporaryFile(类似文件的对象)。它实际的Python文件,您可以将其直接传递给需要“类文件”对象的其他函数或库。(源码中是这样定义的:
file = tempfile.SpooledTemporaryFile(max_size=self.spool_max_size)
)
UploadFile
的file
属性具有很多异步方法(这些方法也可以同步调用):write(data):写入文件
read(size):读取文件,
- 例:
contents = await myfile.read()
- 例:
seek(offset):游标到文件中offset对应字节的位置
- 例:
await myfile.seek(0)
将会到文件开始的位置 - 如果运行一次
await myfile.read()
然后需要再次读取内容,则此功能特别有用。
- 例:
close():关闭文件
上传多个文件
1 | from typing import List |
可以打开http://127.0.0.1:8000/docs
或者http://127.0.0.1:8000/
进行尝试,请求http://127.0.0.1:8000/
会进入到我们自定义的页面:
总结
- 无论是使用
Form
还是File
都不要忘记安装python-multipart
- 如果我们同时使用了
Form
和Body
,请求将会以表单的形式发送给服务端 - 上传大文件时最好使用
UploadFile
- 如果方法是异步的,可以使用
UploadFile
上述栗子均放到git上啦,地址:戳这里