前言
本文是该专栏的第1篇,后面会持续分享FastApi以及项目实战的各种干货知识,值得关注。
FastApi是一个现代、快速(高性能)的基于Python3.6+的web框架,用于构建API。它旨在使API开发更快,更简单,并且更具有扩展性。FastApi甚至可以和Go类似拥有极高的性能,除此之外,FastApi相较于Django和Flask,相对比较年轻,不过这并不影响FastApi的使用和维护。
而本文将针对FastApi框架,从入门FastApi的重要知识点到项目部署,进行一个详细介绍。下面跟着笔者,直接往下看正文详细部分。
正文
它的特定,总的来说可概括为以下十点:
1. 快速:FastAPI的默认模板比其他任何框架都快;
2. 简单:使用Python 3.6+的最新功能,如类型提示和路径操作;
3. 类型安全:受益于Python的类型提示,FastAPI可以帮助你在开发时捕获许多错误;
4. 自动依赖注入:通过使用Python的内置功能,FastAPI可以自动注入依赖项,使代码更清晰,更易于测试和重用;
5. 支持异步:FastAPI支持异步操作,使其能够处理高并发请求;
6. 可扩展:你可以轻松地扩展FastAPI以适应你的需求,例如通过添加中间件、自定义错误处理等;
7. 与数据库集成:FastAPI可以与许多数据库集成,包括PostgreSQL、MongoDB等;
8. 易于测试:FastAPI的路径和中间件可以很容易地与测试框架集成,使得测试更容易进行;
9. 开放API规范支持:FastAPI支持OpenAPI规范,可以轻松生成API文档;
10. 易于部署:FastAPI可以轻松部署到许多平台上,包括Docker、Kubernetes等。
需要注意的是,使用FastApi有版本要求,最好是将python提升至3.8版本及以上。
如果本地没有安装FastApi,可以在终端使用如下命令进行安装,命令如下所示:
pip install fastapi
除此之外,我们还需要安装ASGI服务器。ASGI是异步网关协议接口,一个介于网络协议服务和 python应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket。所以在安装好FastApi之后,接下来就需要再安装Uvicorn,安装Uvicorn同样使用pip命令即可,如下所示:
pip install uvicorn
Uvicorn是一个基于ASGI(Asynchronous Server Gateway Interface)的异步Web服务器,用于运行异步python web应用程序。它是由编写FastAPI框架的开发者设计的,旨在提供高性能和低延迟的Web服务。
假设现有main.py文件,其示例代码如下所示:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
"""
注册一个根路径
:return:
"""
return {"message": "Hello World"}
@app.get("/info")
async def info():
"""
项目信息
:return:
"""
return {
"app_name": "FastAPI框架学习",
"app_version": "v0.0.1"
}
我们想要启动上面的main.py文件,在终端输入如下命令即可:
uvicorn main:app --reload
需要注意的是,在启动命令uvicorn main:app --reload中的app,指的是app = FastAPI()变量,也可以是其他自己定义的名称;
在上面的代码中:
第一步: 导入FastAPI(from fastapi import FastAPI),可以把FastAPI理解为是API 提供所有功能的 Python 类;
第二步: 创建 FastAPI 实例(app = FastAPI()),实例化一个类,变量 app 是 FastAPI 的类实例;
第三步: 使用@app.get注册路由,其中app是 FastAPI 类实例变量名,也可以是其他;除了@app.get之外还支持:@app.post、@app.put、@app.delete..等方法;
第四步: 使用uvicorn启动服务;
虽然通过uvicorn启动服务很方便,但有时候我们需要debug本地程序,方便问题排查,FastAPI也支持传统启动方式;修改main.py文件,可以追加以下代码:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def index():
"""
注册一个根路径
:return:
"""
return {"message": "Hello World"}
@app.get("/info")
async def info():
"""
项目信息
:return:
"""
return {
"app_name": "FastAPI框架学习",
"app_version": "v0.0.1"
}
if __name__ == '__main__':
# 需要主要的是,这里的main表示该python文件名为main.py
uvicorn.run(app="main:app", host="0.0.0.0", port=8000)
以debug模式启动后,就可以打断点进行代码调试。
接下来,我们再来尝试请求目标接口。
当我们成功运行上述代码之后,只需锁定目标ip和端口,以及目标接口后缀即可。以上面的代码为例,在网址输入如下信息:
值得注意的是,在上述代码中,我们使用了“0.0.0.0”地址作为监控地址,而“0.0.0.0”地址是支持所有,即“支持本地通过127.0.0.1”或IP访问,支持其他主机通过IP访问。
FastApi框架在启动时,除了注册路由之外,还会自动生成API在线文档,并且生成两种在线文档:分别为Swagger UI和ReDoc,访问地址分别为:
# SwaggerUi风格文档
http://127.0.0.1:8000/docs
# ReDoc风格文档
http://127.0.0.1:8000/redoc
当然了,如果你不想生成交互式文档,就可以通过以下方式实例化FastApi:
# docs_url=None: 代表关闭SwaggerUi
# redoc_url=None: 代表关闭redoc文档
app = FastAPI(docs_url=None, redoc_url=None)
FastAPI框架内部实现了OpenAPI 规范,通过访问 http://127.0.0.1:8000/openapi.json,我们可以看到整个项目的API对应的JSON描述信息,示例如下所示:
{
"openapi": "3.1.0",
"info": {
"title": "FastAPI",
"version": "0.1.0"
},
"paths": {
"/": {
"get": {
"summary": "Index",
"description": "注册一个根路径\n:return:",
"operationId": "index__get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"/info": {
"get": {
"summary": "Info",
"description": "项目信息\n:return:",
"operationId": "info_info_get",
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
}
}
}
这里简单的补充一点,假设我们在app/router目录下有如下文件,示例如下:
app/router
├── __init__.py
├── default_router.py
└── demo_router.py
每个路由文件里面的编辑流程和逻辑基本一样,这里以default_router.py为例,示例代码如下:
# 导入APIRouter
from fastapi import APIRouter
# 实例化APIRouter实例
router = APIRouter(tags=["默认路由"])
# 注册具体方法
@router.get("/")
async def index():
"""
默认访问链接
"""
return {
"code": 200,
"msg": "Hello World!"
}
主体文件main.py,示例代码如下:
from fastapi import Depends, FastAPI
...
# 从routers导出路由文件:items, users
from .routers import items, users
# 挨个注册文件
app.include_router(users.router)
app.include_router(items.router)
app.include_router(
admin.router,
prefix="/admin",
tags=["admin"],
dependencies=[Depends(get_token_header)],
responses={418: {"description": "I'm a teapot"}},
)
@app.get("/")
async def root():
return {"message": "Hello Bigger Applications!"}
接下来再尝试进行优化导入,在__init__.py中定义变量,把要注册的路由统一放在列表中,然在main.py中通过循环加载路由;后续有新增路由时,直接在列表中新增元素即可;
编辑app/router/__init__.py文件,示例代码如下:
from app.router import default_router, demo_router
# 定义路由列表
RegisterRouterList = [
default_router,
demo_router
]
再接下来,对main.py文件进行修改即可,如下所示:
import uvicorn
from fastapi import FastAPI
from app.router import RegisterRouterList
# 实例化
app = FastAPI()
# 加载路由
for item in RegisterRouterList:
app.include_router(item.router)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
如果还想了解FastApi以及项目实战的其他干货知识,我会在后面持续更新,记得收藏并点赞,后面的python干货在等着你。
如果喜欢本文或者本文对你有帮助的话,记得收藏并点赞,有问题和需求欢迎留言私信。