一、前言

最近我在进行 web 开发,前后端分离的 web。前端框架使用 Vue,使用前端组件库为 Element-UI,后端在 Django-Rest-Framework、Flask、FastApi 中徘徊。经过一个一个的测试。最终选择了 FastApi。

原因有以下几点:

  1. Django-Rest-Framework:给人的感觉笨重,官方文档对于新手来说不够友好,对于我这个 web 开发的门外汉来说比较难。
  2. Flask:比较轻量,但是对于 api 的开发不是很适应,还需要特定的函数进行转换。
  3. FastApi:具有自带 api 文档(界面很好看,开发时不用编写额外的页面进行测试),对 json 格式的 api 非常友好。

下图为自带的测试界面:

python fastapi json python fastapi jsonrpc_python

二、案例

Hello World

下面是 Hello world 的案例。新建一个 helloworld.py 脚本。

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def home():
    return {"message": "Hello World"}

uvicorn.run(app=app)

在上面脚本中, uvicorn 是一个 ASGI 服务器。默认端口为 8000,默认 hostlocalhost。可以通过下面的方法进行 porthost 的修改。

使用 app.get('/') 注册路由,当访问该地址时,就会返回对应的字典(JSON 串)

uvicorn.run(app, host="127.0.0.1", port=8000)

打开 127.0.0.1:8000/docs 即可测试。使用 docs 的测试结果

python fastapi json python fastapi jsonrpc_数据_02


python fastapi json python fastapi jsonrpc_ico_03

自带这样的文档有很大的好处-减少了编写测试界面的时间。FastApi 还可以直接使用 JSON 格式进行返回(还支持还有更好的方法,就例如下面的案例)

在这个案例中,没有体现到 docs 的优势。因为不需要任何输入,即可得到输出。

输入输出

from fastapi import FastAPI
from pydantic import BaseModel, EmailStr

app = FastAPI()


class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: str = None


class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: str = None


@app.post("/user/", response_model=UserOut)
async def create_user(*, user: UserIn):
    return user


# pip install pydantic[email]
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

在函数中,定义参数为 user: UserIn 表明需要输入的数据符合 UserIn 模型。配置 response_modelUserOut,表明输出数据符合 UserOut模型。FastApi 会自动进行过滤

输入

python fastapi json python fastapi jsonrpc_python_04

输出

python fastapi json python fastapi jsonrpc_python fastapi json_05

自带的文档能展示所有的模式(Schemas),会与代码中的类所对应(可以使用字典快速初始化)。

python fastapi json python fastapi jsonrpc_数据_06


python fastapi json python fastapi jsonrpc_JSON_07

其他优点

  1. 可以引入其他的模板
  2. 对新手非常友好的官方教程