Fast API
2021 年 4 月 7 日 星期三(已编辑)
这篇文章上次修改于 2021 年 4 月 7 日 星期三,可能部分内容已经不适用,如有疑问可询问作者。
得益于Django, Flask等强大的框架。 FastAPI是Python比较新的Web框架。它从前吸取很多灵感,对其修复和完善。
FastAPI是一种现代,快速(高性能)的Web框架,用于基于标准Python类型提示使用Python 3.6+构建API。
功能
$>warning 注意
依赖
Python 3.6x
👏 Starlette 负责Web
👏 Pydantic 负责数据
安装完毕查看一下清单文件
第一个程序 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'
最后终端执行.
优化
Pycham启动项目
位置参数 / 路径参数
例子
查询参数
查询字符串是键值对的集合,这些键值对位于 URL 的 ?
之后,并以 &
符号分隔。
FastAPI自动整合Swagger UI
访问
状态码
使用 status_code
参数来声明用于响应的 HTTP 状态码:
status_code 参数接收一个表示 HTTP 状态码的数字
或者使用提供的API
源码 starlette/status.py
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
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)
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":"李四"}
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=你好
# 输出
"您正在查询 你好"
domain/docs
from fastapi import FastAPI
app = FastAPI()
@app.post("/items/", status_code=201) # 201
async def create_item(name: str):
return {"name": name}
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}
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})