Fast API
Python
得益于Django, Flask等强大的框架。 FastAPI是Python比较新的Web框架。它从前吸取很多灵感,对其修复和完善。
FastAPI是一种现代,快速(高性能)的Web框架,用于基于标准Python类型提示使用Python 3.6+构建API。
功能
- 快速:非常高的性能,与NodeJS和Go相当(感谢Starlette和Pydantic)。最快的Python框架之一。
- 快速编写代码:将功能开发的速度提高大约200%至300%。
- 更少的错误:减少约40%的人为错误(开发人员)。
- 直观:强大的编辑器支持。完成无处不在。调试时间更少。
- 简易:旨在易于使用和学习。减少阅读文档的时间。
- 短:最小化代码重复。每个参数声明中的多个功能。更少的错误。
- 健壮:获取可用于生产环境的代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API的开放标准:OpenAPI(以前称为Swagger)和JSON Schema。
准备工作
$>warning 注意
依赖
Python 3.6x
👏 Starlette 负责Web
👏 Pydantic 负责数据
mkdir demo
cd demo
python3 -m venv venv
source venv/bin/active
pip install fastapi
pip install uvicorn # Asgi服务器
安装完毕查看一下清单文件
click==7.1.2
fastapi==0.63.0
h11==0.12.0
pydantic==1.8.1
starlette==0.13.6
typing-extensions==3.7.4.3
uvicorn==0.13.4
第一个程序 Hello FastAPI
简单的示例应用程序可以与uvicorn,一种闪电般的ASGI服务器实现一起使用(Uvicorn是一种闪电般的ASGI服务器实现)
返回值会自动转化为JSON的对象和模型。
from typing import Optional
from fastapi import FastAPI # 1. 导入FastAPI
# 2. 创建实例
app = FastAPI()
# 3. 编写路径操作装饰器
@app.get('/')
def hello(): # 4. 操作函数
return 'Hello FastAPI'
最后终端执行.
uvicorn main:app --reload #5. 运行开发服务器
# 注释
main 表示文件名称
app 表示FastAPI实例
reload 内似前端HotReload
(venv) ➜ 1-first curl 127.0.0.1:8000
"Hello FastAPI"
优化
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def hello():
return 'Hello'
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='127.0.0.1', port=8000)
Pycham启动项目
路由参数
位置参数 / 路径参数
from fastapi import FastAPI
# 创建实例 FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
app = FastAPI()
@app.get('/per/{name}/{id}')
def personInfo(id: int, name: str): # 有类型的路径参数 好处1.错误检查 2.代码补全
return {
"ID": id,
"Name": name
}
例子
# 输入
http://127.0.0.1:8000/per/张三/2
http://127.0.0.1:8000/per/李四/8
# 输出
{"ID":2,"Name":"张三"}
{"ID":8,"Name":"李四"}
查询参数
查询字符串是键值对的集合,这些键值对位于 URL 的 ?
之后,并以 &
符号分隔。
from typing import Optional
from fastapi import FastAPI
# 创建实例
app = FastAPI()
@app.get('/query/')
def question(key: Optional[str]=None):
return '您正在查询 {}'.format(key)
# 输入
http://127.0.0.1:8000/query/?key=你好
# 输出
"您正在查询 你好"
交互式文档
FastAPI自动整合Swagger UI
访问
domain/docs
请求
响应
状态码
使用 status_code
参数来声明用于响应的 HTTP 状态码:
status_code 参数接收一个表示 HTTP 状态码的数字
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/", status_code=201) # 201
async def create_item(name: str):
return {"name": name}
或者使用提供的API
from fastapi import FastAPI, status
app = FastAPI()
@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
return {"name": name}
源码 starlette/status.py
模版
pip install jinja2 # 模版渲染
pip install aiofiles # 处理静态文件
# 模版引擎
from fastapi import Request
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
@app.get('/template', response_class=HTMLResponse)
async def templateDemo(request: Request):
return templates.TemplateResponse("index.html", {"request": request})