目录

简介

性能

api 文档

类型检查

蓝图APIRouter

自定义的tags与responses

注册 APIRouter


简介

官网教程(中文版):FastAPI

python语言下的Web框架有很多,比如:

  • 从大而全的Django。

  • 小而且美的Flask。

  • 很早就支持异步的 Tornado。

  • 性能更进一步的异步框架 sanic。

  • ......

fastapi在如何把后端api做好的这件事情上,做的比sanic更全面,更彻底。fastapi的安装也非常简单,如下:

安装FastAPI
pip install fastapi安装uvicorn来作为服务器
pip install uvicornPs:若要一次性安装所有的可选依赖及对应功能:
pip install fastapi[all]

fastapi的优点很多,比如:性能、api文档、高效的类型检查等

性能

先做个简单的性能对比:

  • flask

# flask==2.0.1
from flask import Flask
from flask import jsonifyapp = Flask(__name__)@app.route("/")
def hello_world():return jsonify({"hello": "world"})
  • fastapi

# fastapi==0.65.1
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"Hello": "World"}

虽然两个框架都支持异步(flask 2.0 支持异步),但我们使用的都是同步代码。

JMeter配置:并发(500)* 循环(100)* 启动时间(1s) = 总请求数(50000)

结果 flask fastapi gin
运行时长 67s 28s 5s
最大值 37197ms 641ms 270ms
平均值 582ms 266ms 40ms
吞吐量 751.s/sec 1798.3/sec 9817.4/sec

虽然是简单的对比,fastapi 在各项性能指标,都有非常明显的性能优势。

Ps:

在相同的环境上开启了gin(go语言) 服务又跑了一遍。gin 在go 主流的几款 web框架下性能表现都是很强的,碾压python Web框架简直太容易了。最后一列是gin的数据。

api 文档

fastapi直接支持OpenAPI(前身是Swagger) 和redoc 两种文档格式。

fastapi_demo.py

# -*- coding: UTF-8 -*-
# fastapi==0.65.1import time
import uvicorn
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: Optional[bool] = None@app.get("/")
def read_root():return {"hello": "world"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}")
async def read_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}if __name__ == '__main__':   # 使用uvicorn启动服务,指定端口8099uvicorn.run(app='fastapi_demo:app', host="0.0.0.0", port=8099, reload=True, debug=True)    
  • 启动服务:python3 fastapi_demo.py
  • 访问服务(API文档):http://127.0.0.1:8099/docs

  • 访问服务(API备用文档):http://127.0.0.1:8000/redoc

代码即文档,压根不用写接口文档。试问:是不是很爽?

类型检查

python是弱类型的语言,直到python 3.5 才加入类型系统。而我们在做接口参数校验的时候,必定要写大量代码验证参数是否为空,类型是否正确。

  • flask
import json
from flask import Flask
from flask import jsonify
from flask import requestapp = Flask(__name__)@app.route('/items/<int:item_id>', methods=['GET', 'POST', "PUT", "DELETE"])
def update_item(item_id):if request.method == "PUT":try:data = json.loads(request.get_data())except json.decoder.JSONDecodeError:return jsonify({"code":10101, "msg": "format error"})try:name = data["name"]price = data["price"]is_offer = data["is_offer"]except KeyError:return jsonify({"code": 10102, "msg": "key null"})if not isinstance(name, str):return jsonify({"code": 10103, "msg": "name not is str"})if not isinstance(price, float):return jsonify({"code": 10104, "msg": "price not is float"})if not isinstance(is_offer, bool):return jsonify({"code": 10105, "msg": "is_offer not is bool"})return jsonify({"item_name": name, "item_id": item_id})

在flask中为了验证参数是否为空,以及参数的类型,必须要写大量的异常和类型判断的代码。

  • fastapi

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: Optional[bool] = None@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}

fastapi 通过 pydantic 检查参数类型,有一点像go的结构体,简直不要太简单。

Ps:Pydantic库简介:Python笔记:Pydantic库简介_codename_cys的博客-CSDN博客_pydantic

蓝图APIRouter

我们都知道在大型的应用程序或者 web api 中, 我们很少在一个文件中写入多个路由,将所有的请求方法写在同一个处理文件下面的话,会导致我们的代码显得很没有逻辑性,这样既不利于程序的扩展,也不利于程序日后的维护。在 Flask 中,我们一般用蓝图 Blueprint 来处理,那么在FastApi 中如何处理呢?

当然可以,在 FastApi 中使用 APIRouter 处理这种多程序分类,即类似 Flask 中的蓝图。可以直接参考:更大的应用 - 多个文件 - FastAPI

假设我们的系统有2个模块:users和items

  • users模块

假设专门用于处理用户的文件是的子模块/app/routers/users.py

您希望将与用户相关的路径操作与其余代码分开,使其看起来简洁明了。

可以使用来为该模块创建路径操作 APIRouter。

./route/users.py

from fastapi import APIRouterrouter = APIRouter()@router.get("/users/", tags=["users"])
async def read_users():return [{"username": "Rick"}, {"username": "Morty"}]@router.get("/users/me", tags=["users"])
async def read_user_me():return {"username": "fakecurrentuser"}@router.get("/users/{username}", tags=["users"])
async def read_user(username: str):return {"username": username}

web 服务中还有另外一个应用模块,items。

同样的通过APIRouter来对其路由进行注册,代码如下:./router/items.py

from typing import Optional
from fastapi import APIRouter, Depends, HTTPExceptionrouter = APIRouter(prefix="/items",tags=["items"],responses={403: {"description": "Operation forbidden"}}
)@router.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):if item_id != 123:raise HTTPException(status_code=403)return {"item_id": item_id, "q": q}@router.get("/{item_id}")
async def read_item(item_id: str):if item_id != "123":raise HTTPException(status_code=404, detail="Item not found")return {"name": "rongsong", "item_id": item_id}

这样就将两个功能模块 item, user 给分离开来了,后期我们想更新或扩展 user 模块的功能,并不会对 item 造成影响!

上面便是 APIRouter 最最基础也是最强大之处,还有其他功能吗?当然有!

自定义的tags与responses

细心的朋友应该发现了,在上述 item.py 中实例化 router的时候,传了好几个参数

一起来看看分别代表什么含义!

prefix 参数,路由的前缀

tags 将应用于特定路径操作的内容

responses 指特定于该路径下的响应内容,如上述便指定 404 的返回信息

注册 APIRouter

最后一个步骤就是要将我们的 APIRouter 注册到核心对象上去

和之前我们创建主文件一样导入 FastApi,以及声明的 APIRouter 实例。

main.py

import uvicorn
from fastapi import Depends, FastAPI
from router import items, usersapp = FastAPI()app.include_router(users.router)
app.include_router(items.router)@app.get("/")
async def root():return {"message": "Hello Bigger Applications!"}if __name__ == '__main__':   # 使用uvicorn启动服务,端口8099uvicorn.run(app='main:app', host="0.0.0.0", port=8099, reload=True, debug=True)  

其中 include_router() 函数就是上面说的注册。这时候就完成了,使用该 app 来启动服务即可

  • 启动命令:python3 main.py
  • 访问服务:http://127.0.0.1:8099/docs,正常情况下显示如下所示:

更多的内容可以参考官网教程(中文版):FastAPI

Python-web框架 fastapi相关推荐

  1. FastAPI - 一款新型的 Python Web 框架(对比 Flask)

    近日曾想尽办法为 Flask 实现 Swagger UI 文档功能,找到的实现方式基本上是 Flask + Flasgger, 记录在 Flask 应用集成 Swagger UI.然而不断的 Goog ...

  2. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  3. python web框架基础

    文章目录 1. Web框架简介 1.1 MVC 1.2 模板引擎 2. 常用 Python Web 框架 3. 虚拟环境 4. 部署方式 learning from <python web开发从 ...

  4. python 3.7安装festtext、提示要更新_现代开发者必备:5个更流畅、更受欢迎的Python web框架...

    本文转载自公众号"读芯术"(ID:AI_Discovery). 如今,可供选择的Python web框架有不少,能帮助你更快更轻松地创建web应用.本文就将为大家介绍一些更现代.使 ...

  5. 防掉线、防脱发的异步高性能Python Web框架

    FastAPI是一个用于构建API的现代.快速(高性能)的Web框架,使用Python 3.6+并基于标准的Python类型提示. 可与NodeJS和Go比肩的极高性能(归功于Starlette和Py ...

  6. python web框架介绍对比

    Django Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django.要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善.市场占 ...

  7. python写web难受-(2017)你最不建议使用的Python Web框架?

    原标题:(2017)你最不建议使用的Python Web框架? 前言 这是一篇发在知乎专栏的文章,内容是之前我提的「(2017)你最不建议使用的Python Web框架?」下的回答.不过有些话没有说完 ...

  8. python的web框架哪个最好学_2018年要学习的10大Python Web框架

    通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...

  9. python web框架互相融合, Pyramid或取代Django

    Django用久了,难免会感觉到自由度不够.不可否认,这种自由度的牺牲能够带来一些好处.比如,一体化的框架(full-stack framework)能够提供全面的solution,你不需要再为cac ...

  10. python web 框架例子_最快的 Python Web 框架入门

    原标题:最快的 Python Web 框架入门 来源:Python开发 ID:PythonPush 速度比较 框架 实现基础 每秒请求数 平均时间 Sanic Python 3.5 + uvloop ...

最新文章

  1. 【 MATLAB 】z 变换中的卷积与解卷积
  2. V4L2 driver(一). 整体框架
  3. sql注入——day02
  4. boost::thread_group相关的测试程序
  5. bootstrap 单选按钮点击change事件 只触发一次_微信支付新增“确认”按钮,付错钱将成为历史?...
  6. SequentialSearch 顺序表查找
  7. malloc()与 alloc()区别(转)
  8. koa2异常处理_koa2 中的错误处理以及中间件设计原理
  9. 毕设题目:Matlab DTMF双音多频
  10. python条形码,Python中的远距离条形码
  11. java 查看jar 版本信息_Jar包版本查看方法
  12. java httpclient 下载_java HttpClient 下载一张图片
  13. 测试用例(分析法——详细场景法)
  14. 为什么c语言运行后输入的中文会乱码
  15. U盘装完系统后,不能用,写保护,无法格式化,变为RAW解决办法
  16. 医药魔方完成数千万元A轮融资,大数据支持中国制药产业升级
  17. 透彻理解超级电容的11个参数
  18. win7中显示桌面的方式有哪些?
  19. 阿里云网站备案申请被驳回怎么办?
  20. 哈哈日语 五十音图之あ段音

热门文章

  1. delphi listbox 使用
  2. 09基于对象编程风格
  3. hana数据库 字段长度_SAP HANA: 列式内存数据库评测
  4. python 滚动字幕_Python pygame绘制文字制作滚动文字过程解析
  5. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值
  6. android.os.parcelable,Android中Parcelable如可快速生成
  7. oracle数据库出错0095,一种ORACLE数据库优化配置的方法及系统专利_专利查询 - 天眼查...
  8. java用 拼接字符串的原理_Java String 拼接字符串原理详解
  9. linux redis 数据迁移,redis cluster 迁移数据
  10. oracle 数组的用法,Oracle数组用法