简介
该框架的速度(天然支持异步)比一般的django和flask要快N多倍
使用该框架需要保证python解释器版本是3.6及以上
Ps:django3.X版本也支持异步,但是它的异步功能并没有真正的实现,还有很多bug
FastApi官网展示了FastApi的特点
快速:非常高的性能,看齐的NodeJS和Go(感谢Starlette和Pydantic)。现有最快的Python框架之一。
快速编码:将功能开发速度提高约200%至300%。
更少的错误:减少约40%的人为错误(开发人员)。
直观:强大的编辑器支持。完成无处不在。调试时间更少。
简易:旨在易于使用和学习。减少阅读文档的时间。
短:最小化代码重复。每个参数声明中的多个功能。更少的错误。
健壮:获取可用于生产的代码。具有自动交互式文档。
基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。
安装
1 | pip3 install fastapi |
创建
编辑一个文件main.py
1 | from fastapi import FastAPI |
以上就是最简单的一个 Fast 接口, 需要注意的是, FastApi内部处理网络io的时候使用的是Async, 但是进入函数的具体逻辑不受框架控制, 你可以写成同步,当然写成异步最佳,这里及本系列后面的都是能用异步则用异步,实在没有的再用同步
启动这个项目
在命令行下输入
1 | uvicorn main:app --reload |
这行命令的意思是使用 uvicorn 启动 main.py 的 app
reload 指检测到文件改动时自动重载(这在调试时非常有用)
运行后会输出
1 | Copy(.venv) ➜ fast uvicorn main:app --reload |
代表启动成功,此时我们可以使用 postman 等调试工具测试接口
以 get 的方式请求 http://127.0.0.1:8000/
返回我们定义的数据为正常
1 | {"hello": "world"} |
或者
1 | .get("/") |
可以在pycharm直接运行,但不推荐这个方法
模版渲染
您可以将任何所需的模板引擎与FastAPI一起使用。
常见的选择是Jinja2,与Flask和其他工具使用的选举相同。
有一些实用程序可以轻松配置它,您可以直接在FastAPI应用程序(由Starlette提供)中使用它。
安装jinja2
1 | pip install jinja2 |
如果您还需要提供静态文件(如本例所示),请安装aiofiles:
1 | pip install aiofiles |
main.py
1 | from fastapi import FastAPI |
index.html
1 | <html lang="en"> |
得到
1 | hello fastapi |
输入http://127.0.0.1:8000/233333
得到
1 | hello fastapi |
form表单数据交互
基本数据
注意: 如果要使用request.form()支持表单“解析”,则为必需 python-multipart 。
pip install python-multipart
1 | from starlette.requests import Request |
前端为
1 | <form action="/user/" method="post" enctype="application/x-www-form-urlencoded"> |
文件交互
单文件上传
1 | from fastapi import FastAPI, File, UploadFile |
多文件上传
1 | from typing import List |
请注意因为后端定义为files,所以前端对应的标签name属性也得为files,否则会失败这些文件将作为“表单数据”上传。
如果您将路径操作函数参数的类型声明为bytes,则FastAPI将为您读取文件,并且您将以形式接收内容bytes。
请记住,这意味着全部内容将存储在内存中。这对于小文件将非常有效。
但是在某些情况下,您可能会从中受益UploadFile。
UploadFile
使用UploadFile有几个优势相对于bytes:
- 它会使用“spooled”文件,文件存储在内存中并拥有最大的内存大小限制,并且超过了这个限制就会存储在硬盘中。
- 意味着它同样适用于更大的文件(图片,视频,更大的二进制文件等)又不会消耗很大的内存。
- 可以从上传文件中得到metadata
- 它会暴露出一个python的SpooledTemporaryFile对象,你可以直接使用它进行传递。
它拥有一下属性:
- filename:上传的源文件的名字
- content_type:(MIME type/media type)(eg:image/jpeg)
- file:可用于直接传递的SpooledTemporaraFile对象。
同时也拥有一下async方法:
- write(data):
- read(data):
- seek(data):
- close()
这些都是async方法,需要使用await调用他们。