1.什么是FastAPI
FastAPI是一种现代,快速(高性能)的Web框架,用于基于标准Python类型提示使用Python 3.6+构建API。
特点:
- 快速:非常高的性能,看齐的NodeJS和围棋(感谢Starlette和Pydantic)。现有最快的Python框架之一。
- 快速编写代码:将功能开发的速度提高大约200%至300%。
- 错误更少:减少约40%的人为错误(开发人员)。
- 直观:强大的编辑器支持。完成无处不在。调试时间更少。
- 简易:旨在易于使用和学习。减少阅读文档的时间。
- 短:最小化代码重复。每个参数声明中的多个功能。更少的错误。
- 健壮:获取可用于生产的代码。具有自动交互式文档。基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。
2.安装FastAPI
pip install uvicorn
pip install fastapi
注意:
官方推荐了可以与 FastApi 搭配的几个模块, 基本上涵盖了几个大的使用场景
由Pydantic使用:
ujson-用于更快的JSON “解析”。
email_validator -用于电子邮件验证。
由Starlette使用:
requests-如果要使用,则为必填TestClient。
aiofiles-如果要使用FileResponse或,则为必填StaticFiles。
jinja2 -如果要使用默认模板配置,则为必需。
python-multipart-如果要使用来支持表单“解析”,则为必填request.form()。
itsdangerous-需要SessionMiddleware支持。
pyyaml-Starlette SchemaGenerator支持所必需的(FastAPI 可能不需要它)。
graphene-需要GraphQLApp支持。
ujson-如果要使用,则为必需UJSONResponse。
由FastAPI / Starlette使用:
uvicorn -用于加载和服务您的应用程序的服务器。
orjson-如果要使用,则为必需ORJSONResponse。
您可以使用安装所有这些pip install fastapi[all]。
3.一个简单的hello word 程序
在安装完依赖后,一切的一切就从 HelloWorld 开始
新建一个 py 文件名叫 main.py
代码如下:
from fastapi import FastAPI
app = FastAPI() # 初始化app
@app.get("/") # 监听GET请求
async def read_root():
return {"hello": "world"} # 返回json
以上就是最简单的一个 Fast 接口, 需要注意的是, FastApi内部处理网络io的时候使用的是Async, 但是进入函数的具体逻辑不受框架控制, 你可以写成同步,当然写成异步最好
启动服务:
1.在Terminal中启动
输入以下命令行启动
uvicorn app:app --host 127.0.0.1. --port 8888 --reload
"""
这行命令的意思是使用 uvicorn 在 127.0.0.1服务器上的8888端口 启动 main.py 的 app,
reload 指检测到文件改动时自动重载(这在调试时非常有用)
"""
2.通过os.system启动
代码如下:
from fastapi import FastAPI
import os
app = FastAPI()
@app.get('/hello/{name}')
def read_root_get(name):
res = {}
res['name'] = name
return {"hello": res}
if __name__ == "__main__":
command = "uvicorn demo12:app --host 0.0.0.0 --port 8888 --reload"
os.system(command)
直接运行该文件就能启动服务
3. 或者他用过uvicorn.run(启动)
from fastapi import FastAPI
import os
app = FastAPI()
@app.get('/hello/{name}')
def read_root_get(name):
res = {}
res['name'] = name
return {"hello": res}
if __name__ == "__main__":
uvicorn.run(app=app,host="0.0.0.0",port=8888)
4.自动生成接口文档
FastApi 会自己给你生成接口文档, 默认提供了两种接口文档, 其实内容一样, 只是使用了两个开源的文档框架swagger, redoc
swagger,默认文档位置在http://127.0.0.1:8888/docs
redoc, 默认文档位置在 http://127.0.0.1:8888/redoc
5.参数传递
1.get传参
- url传参
例:http://127.0.0.1:8888/hello/zhangsan 接收参数代码如下
@app.get("/hello/{name}")
def get_name(name: str):
return {'name': name}
- query传参
例:http://127.0.0.1:8888/login?username=张三&password=123456 接收函数代码如下:
@app.get("/login")
def login(username:str, password: str):
return{'name': username, 'pwd': password}
- 混合传参
例:http://127.0.0.1:8888/login/123?user_id=333 接收函数代码如下:
@app.get("/login/{path}")
def login(path: str, user_id:str):
return{"path": path, "id": user_id}
"""
如果想要允许user_id传递的时候为空值(就是不传递user_id)那么就需要设置,代码如下
@app.get("/login/{path}")
def login(path: str, user_id:str = None):
return{"path": path, "id": user_id}
"""
6.body传参
body传参也和get传参一样,是以函数传参的形式,这里就不多说了。但是有时候,body传参可能参数会有很多的情况,这种情况如果都使用函数传参的形式,不美观, 所以我们可以采用application/json 的方式, 并且定义一个参数类来管控参数,代码如下:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel): # 定义一个类用作参数
name: str
price: float
is_offer: bool = None # 该字段可为空
@app.put("/{item_id}")
async def update_item(item_id: int, item: Item): # item需要与Item对象定义保持一致,item_id和get传参一样
return {
"item_name": item.name,
"item_id": item_id
}
FastAPI的强大之处,是在传递参数的时候,会对参数进行验证,如上代码,
- 验证了请求中item_id的路径是否存在,并且该item_id的类型是否是int类型
- 检查是否具有必填参数name,且该类型为str
- 检查是否具有必填参数price,且该类型为float
- 检查是否存在参数is_offer,如果存在类型为bool