Javascript is required
Fast API

得益于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

image-20210407203852919

(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启动项目

image-20210407224820231


路由参数

位置参数 / 路径参数

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

image-20210407205404908

请求

响应

状态码

使用 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

image-20210407213631527

模版

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})

image-20210407225406334