FastApi-快速入门FastApi框架(1)

发布时间:2023年12月20日

前言

本文是该专栏的第1篇,后面会持续分享FastApi以及项目实战的各种干货知识,值得关注。

FastApi是一个现代、快速(高性能)的基于Python3.6+的web框架,用于构建API。它旨在使API开发更快,更简单,并且更具有扩展性。FastApi甚至可以和Go类似拥有极高的性能,除此之外,FastApi相较于Django和Flask,相对比较年轻,不过这并不影响FastApi的使用和维护。

而本文将针对FastApi框架,从入门FastApi的重要知识点到项目部署,进行一个详细介绍。下面跟着笔者,直接往下看正文详细部分。

正文

1.?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等。


2.?FastApi的依赖安装

需要注意的是,使用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服务。


3. 快速启动FastApi

假设现有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"
    }
3.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启动服务;

3.2 调试模式

虽然通过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模式启动后,就可以打断点进行代码调试。


4. 访问服务

接下来,我们再来尝试请求目标接口。

4.1 接口访问

当我们成功运行上述代码之后,只需锁定目标ip和端口,以及目标接口后缀即可。以上面的代码为例,在网址输入如下信息:

值得注意的是,在上述代码中,我们使用了“0.0.0.0”地址作为监控地址,而“0.0.0.0”地址是支持所有,即“支持本地通过127.0.0.1”或IP访问,支持其他主机通过IP访问。

4.2 文档访问

FastApi框架在启动时,除了注册路由之外,还会自动生成API在线文档,并且生成两种在线文档:分别为Swagger UIReDoc,访问地址分别为:

# 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)
4.3 OpenAPI访问

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": {}
                            }
                        }
                    }
                }
            }
        }
    }
}

5. 路由加载

5.1 路由文件

这里简单的补充一点,假设我们在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干货在等着你。

如果喜欢本文或者本文对你有帮助的话,记得收藏并点赞,有问题和需求欢迎留言私信

文章来源:https://blog.csdn.net/Leexin_love_Ling/article/details/135052742
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。