FastAPI的介绍,特性,及⼏个常⽤案例
⼀. 介绍
FastAPI 是⼀个⽤于构建 API 的现代、快速(⾼性能)的 web 框架,使⽤ Python 3.6+ 并基于标准的 Python 类型提⽰。
官⽅中⽂⽂档:
官⽅⽂档:
源码:
socket编程聊天室
FastAPI依赖于下⾯这两⼤重要的成果:
1. web部分参考:Starlette
2. 数据部分参考:Pydantic
fastapi安装
1. 安装fastapi: pip install fastapi
2. 如果⽤于⽣产,那么你还需要⼀个ASGI服务器,如Uvicorn或Hypercorn: pip install uvicorn
可选的依赖
1. Pydantic提供:
ujson - 更快的JSON
email_validator - 电⼦邮件的验证
linux修改名称
2. Starlette提供:
requests - 如果你想要使⽤TestClient, 需要导⼊requests.
aiofiles - 如果你想使⽤FileResponseor StaticFiles, 需要导⼊aiofiles.
jinja2 - 如果你想使⽤默认的模板配置,需要导⼊jinjia2.
python-multipart -如果要使⽤request.form()⽀持表单“解析”,则为必需。
itsdangerous -“SessionMiddleware”⽀持需要。
pyyaml - 如果需要 SchemaGenerator ⽀持, 则为必要.
graphene -如果需要 GraphQLApp ⽀持, 则为必要.
ujson - 如果你想使⽤ UJSONResponse, 则为必要.
3. FastAPI / Starlette提供:
uvicorn - 加载和提供应⽤程序的服务器.
4. ⼀次性全部安装
pip3 install fastapi[all]
根据官⽅介绍,我们看到FastAPI的速度得益于使⽤了Starlette——⼀个轻量级的ASGI框架。
ASGI,全称为Asynchronous Server Gateway Interface,为了规范⽀持异步的Python Web服务器、框架和应⽤之间的通信⽽定制,同时囊括了同步和异步应⽤的通信规范,并且向后兼容WSGI。由于最新的HTTP协议⽀持异步长连接,⽽传统的WSGI应⽤⽀持单次同步调⽤,即仅在接受⼀个请求后返回响应,从⽽⽆法⽀持HTTP长轮询或WebSocket连接。在Python3.5增加async/await特性之后,基于as
yncio和协程的异步应⽤编程变得更加⽅便。ASGI协议规范就是⽤于asyncio框架的最低限度的底层服务器/应⽤程序接⼝。
异步⾮阻塞I/O & 协程
阻塞I/O,⾮阻塞I/O,I/O多路复⽤都属于同步I/O。⽽异步I/O则不⼀样,当进程发起I/O操作之后,就直接返回再也不理睬了,直到kernel发送⼀个信号,告诉进程说I/O完成。在这整个过程中,进程完全没有被阻塞。在⾮阻塞I/O中,虽然进程⼤部分时间都不会被阻塞,但是它仍然要求进程去主动的查询,并且当数据准备完成以后,也需要进程主动的再次调⽤recvfrom()来将数据拷贝到⽤户内存。
相对于线程,协程是程序级的I/O调度,是对⼀个线程进⾏分⽚,使得线程在代码块之间来回切换执⾏,⽽⾮逐⾏执⾏,因此能够⽀持更快的上下⽂切换。协程本⾝并不能实现⾼并发,但与I/O切换结合后能够⼤⼤提⾼性能。每当发⽣I/O,⾃动切换协程,让出CPU资源,即可减少⾼并发场景下服务的响应时间。因此,结合async/await语法,将代码块定义为协程,使⽤异步服务器即可实现程序级I/O切换和协程调度。
⼆. 关键特性:
快速:可与 NodeJS 和 Go ⽐肩的极⾼性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之⼀。
⾼效编码:提⾼功能开发速度约 200% ⾄ 300%。
更少 bug:减少约 40% 的⼈为(开发者)导致错误
智能:极佳的编辑器⽀持。处处皆可⾃动补全,减少调试时间。数据类型校验。
简单:设计的易于使⽤和学习,阅读⽂档的时间更短。
简短:使代码重复最⼩化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:⽣产可⽤级别的代码。还有⾃动⽣成的交互式⽂档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
三. ⼏个常⽤案例
3.1 第⼀个案例
# -*- encoding: utf-8 -*-
"""
@Author: cuiyonghua
@CreateDate: 2020/08/30 10:27 上午
@File: 第⼀个案例.py
@Description:
"""
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@("/")
def read_root():
怎么下载jquery插件return{"message":"Hello World"}
@("/items/{item_id}")
def read_item(item_id:int, q: Optional[str]=None):
return{"item_id": item_id,"q": q}
python请求并解析json数据
if __name__ =='__main__':
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
3.1.2 使⽤浏览器访问:
将会看到如下 JSON 响应:
{"item_id":5,"q":"somequery"}
系统的一般模式图3.1.3 你已经创建了⼀个具有以下功能的 API:
通过路径 / 和 /items/{item_id} 接受 HTTP 请求。
以上路径都接受 GET 操作(也被称为 HTTP ⽅法)。
/items/{item_id} 路径有⼀个路径参数 item_id 并且应该为 int 类型。
/items/{item_id} 路径有⼀个可选的 str 类型的查询参数 q。
3.1.4 交互式 API ⽂档
现在访问 。
你会看到⾃动⽣成的交互式 API ⽂档(由 Swagger UI⽣成):
升级版API⽂档可访问:
3.2 ⾃定义响应状态码
# -*- encoding: utf-8 -*-
"""
@Author: cuiyonghua
@CreateDate: 2020/08/30 10:11 上午
@File: ⾃定义响应状态码.py
@Description:
"""
from fastapi import FastAPI
from starlette import status
app = FastAPI()
# 201
@("/201/", status_code=status.HTTP_201_CREATED)
async def item201():
return{"httpStatus":201}
# 302
@("/302/", status_code=status.HTTP_302_FOUND)
async def items302():
return{"httpStatus":302,"message":'请求被禁⽌'}
# 404
@("/404/", status_code=status.HTTP_404_NOT_FOUND)
async def items404():
return{"httpStatus":404}
# 500
@("/500/", status_code=status.HTTP_500_INTERNAL_SERVER_ERROR) async def items500():
return{"httpStatus":500}
if __name__ =='__main__':
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
3.3 中间件_计算回调时间
# -*- encoding: utf-8 -*-
"""
@Author: cuiyonghua
@CreateDate: 2020/08/30 10:01 上午
@File: 中间件_计算回调时间.py
@Description:
"""
import time
from fastapi import FastAPI
quests import Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response =await call_next(request)
process_time = time.time()- start_time10进制80的16进制是多少
response.headers["X-Process-Time"]=str(process_time)
print(response.headers)
return response
@("/")
async def main():
return{"message":"Hello World"}
if __name__ =='__main__':
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
四. 总结
1. 总的来说,你就像声明函数的参数类型⼀样只声明了⼀次请求参数、请求体等的类型。
2. 你使⽤了标准的现代 Python 类型来完成声明
1. ⽤于创建 API 的 OpenAPI 包含了路径操作,请求参数,请求体,安全性等的声明。
2. 使⽤ JSON Schema (因为 OpenAPI 本⾝就是基于 JSON Schema 的)⾃动⽣成数据模型⽂档。
3. 经过了缜密的研究后围绕这些标准⽽设计。并⾮狗尾续貂。
4. 这也允许了在很多语⾔中⾃动⽣成客户端代码。
3. 你不需要去学习新的语法、了解特定库的⽅法或类,等等。
4. 只需要使⽤标准的 Python 3.6 及更⾼版本。(全部都基于标准的 Python 3.6 类型声明(感谢 Pydantic )。没有新的语法需要学
习。只需要标准的 Python 。)
5. 安全性及⾝份验证:集成了安全性和⾝份认证。杜绝数据库或者数据模型的渗透风险。
OpenAPI 中定义的安全模式,包括:
1. HTTP 基本认证。
2. OAuth2 (也使⽤ JWT tokens)。在 OAuth2 with JWT查看教程。
3. API 密钥,在:请求头。查询参数。Cookies, 等等。
4. 加上来⾃ Starlette(包括 session cookie)的所有安全特性。
所有的这些都是可复⽤的⼯具和组件,可以轻松与你的系统,数据仓库,关系型以及 NoSQL 数据库等等集成。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。