一、前言
最近我在进行 web 开发,前后端分离的 web。前端框架使用 Vue,使用前端组件库为 Element-UI,后端在 Django-Rest-Framework、Flask、FastApi 中徘徊。经过一个一个的测试。最终选择了 FastApi。
原因有以下几点:
- Django-Rest-Framework:给人的感觉笨重,官方文档对于新手来说不够友好,对于我这个 web 开发的门外汉来说比较难。
- Flask:比较轻量,但是对于 api 的开发不是很适应,还需要特定的函数进行转换。
- FastApi:具有自带 api 文档(界面很好看,开发时不用编写额外的页面进行测试),对 json 格式的 api 非常友好。
下图为自带的测试界面:
二、案例
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
,默认 host
为 localhost
。可以通过下面的方法进行 port
和 host
的修改。
使用 app.get('/')
注册路由,当访问该地址时,就会返回对应的字典(JSON
串)
uvicorn.run(app, host="127.0.0.1", port=8000)
打开 127.0.0.1:8000/docs 即可测试。使用 docs 的测试结果
自带这样的文档有很大的好处-减少了编写测试界面的时间。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_model
为 UserOut
,表明输出数据符合 UserOut
模型。FastApi 会自动进行过滤
输入
输出
自带的文档能展示所有的模式(Schemas),会与代码中的类所对应(可以使用字典快速初始化)。
其他优点
- 可以引入其他的模板
- 对新手非常友好的官方教程