Python框架篇(1):FastApi-快速入门

1.介绍

前言: 不管学什么语言,都应该至少掌握一个框架,方面我们后续,进行服务部署、服务对外支持等;

1.1 官网介绍

下面是来自FastAPI官网的介绍:

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJSGo 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

  • 高效编码:提高功能开发速度约 200% 至 300%。

  • 更少 bug:减少约 40% 的人为(开发者)导致错误。

  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。

  • 简单:设计的易于使用和学习,阅读文档的时间更短。

  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。

  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。

  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

  • 官方文档:https://fastapi.tiangolo.com/zh/

1.2 Github热度

框架Star开源地址
django73.9khttps://github.com/django/django
flask64.9Khttps://github.com/pallets/flask
fastapi64.3Khttps://github.com/tiangolo/fastapi

关于选框架一事,每个人的见解都不一样,这里不做比较,简单陈述下,我之所以选择这个框架的原因:

  • 号称和 Go并肩的极高性能, 想体验下;
  • 框架和之前两个对比,相对比较年轻,从 Github star数来看,成长热度挺好;
  • 官方文档中文支持较好,看着也比较完善;

2.依赖安装

@注意: fastapi有版本要求,需要的Python版本至少是Python 3.8

2.1 安装fastapi

# 使用pip安装
$ pip install fastapi

2.2 安装ASGI 服务器

ASGI是异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 WebSocket

pip install "uvicorn[standard]"

这里简单了解下什么是uvicorn :

Uvicorn是一个基于ASGI(Asynchronous Server Gateway Interface)的异步Web服务器,用于运行异步Python web应用程序。它是由编写FastAPI框架的开发者设计的,旨在提供高性能和低延迟的Web服务;

3. 快速启动

3.1 编写代码

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.2 启动服务

➜ uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['/Users/liuqh/ProjectItem/PythonItem/fast-use-ai']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [11629] using WatchFiles
INFO:     Started server process [11631]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

启动命令uvicorn main:app --reload中的app,指的是app = FastAPI()变量,也可以是其他自己定义的名称;

1.启动步骤分析:

  • 第一步: 导入 FastAPI( from fastapi import FastAPI),可以把 FastAPI理解为是 API 提供所有功能的 Python 类;
  • 第二步: 创建 FastAPI 实例( app = FastAPI()),实例化一个类,变量 appFastAPI类实例
  • 第三步: 使用 @app.get注册路由,其中 appFastAPI 类实例变量名,也可以是其他;除了 @app.get之外还支持: @app.post、@app.put、@app.delete..等方法;
  • 第四步: 使用 uvicorn启动服务;

3.3 调试模式

虽然通过uvicorn启动服务很方便,但有时候我们需要debug本地程序,方便问题排查,FastAPI也支持传统启动方式;修改main.py文件,追加以下代码:

...
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Debug模式启动后,就可以打断点进行代码调试,具体使用方法可参考官方文档:https://fastapi.tiangolo.com/zh/tutorial/debugging

4.访问服务

4.1 访问接口

alt

4.2 访问文档

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

  • SwaggerUi风格文档: http://127.0.0.1:8000/docs
  • ReDoc风格文档: http://127.0.0.1:8000/redoc
alt

1.如何关闭文档生成?

如果不想生成交互式文档,可以通过以下方式实例化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 官方示例目录结构

通常我们开发一个Python服务,都不会将所有代码放到一个文件里,就像我们不会把衣服、鞋子、袜子、食物这些统统装到一个麻袋里一样; 而是会根据功能或者其他规则,分类存放,FastAPI为我们提供了一个模板,具体如下:

.
├── app                  # 「app」是一个 Python 包
│   ├── __init__.py      # 这个文件使「app」成为一个 Python 包
│   ├── main.py          # 「main」模块,例如 import app.main
│   ├── dependencies.py  # 「dependencies」模块,例如 import app.dependencies
│   └── routers          # 「routers」是一个「Python 子包」
│   │   ├── __init__.py  # 使「routers」成为一个「Python 子包」
│   │   ├── items.py     # 「items」子模块,例如 import app.routers.items
│   │   └── users.py     # 「users」子模块,例如 import app.routers.users
│   └── internal         # 「internal」是一个「Python 子包」
│       ├── __init__.py  # 使「internal」成为一个「Python 子包」
│       └── admin.py     # 「admin」子模块,例如 import app.internal.admin

具体代码组织可以参考 更大的应用 - 多个文件: https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/

5.2 自定义目录结构

个人感觉官方推荐的目录结构过于简单,和工作中经常使用的其他语言框架目录结构出入过大,所以进行了自定义修改,也是为了适应自己的开发习惯,具体修改后目录如下:

├── README.md  #项目介绍
├── app
│   ├── __init__.py
│   ├── config  # 配置相关
│   │   └── __init__.py
│   ├── constant  # 常量相关
│   │   └── __init__.py
│   ├── dao # 封装查询数据的方法
│   │   └── __init__.py
│   ├── dependencies  # 封装被依赖函数
│   │   └── __init__.py
│   ├── middleware # 中间件
│   │   └── __init__.py
│   ├── models # 数据模型文件,和表结构对应
│   │   └── __init__.py
│   ├── router # 路由也可以理解controller
│   │   ├── __init__.py
│   │   ├── default_router.py # 默认接口
│   │   └── demo_router.py # 演示接口
│   ├── parameter # 声明参数对应的Pydantic模型
│   │   └── __init__.py
│   ├── service # 就具体业务实现逻辑
│   │   └── __init__.py
│   └── utils # 工具类
│       ├── __init__.py
│       └── str_util.py
├── main.py # 主文件
├── requirements.txt #依赖文件
├── tests # 单元测试目录
    ├── __init__.py
    └── local_test.py

a.__init__.py文件的作用:

  • 标识包目录: 当Python解释器遇到一个目录中包含 __init__.py 文件时,它会将该目录识别为一个包。这样可以通过导入包的方式来组织和访问模块。 在Python3中,__init__.py 不再是创建包的唯一方式

  • 初始化包: __init__.py 文件在包被导入时会被执行,可以用于初始化包级别的变量、设置环境或执行其他必要的初始化操作。

  • 命名空间包含: 通过在 __init__.py 中定义变量、函数或类,可以将它们添加到包的命名空间中,使得在导入包时可以直接访问这些元素。

  • 避免名称冲突: 如果包目录中有与包同名的模块,导入包时可能会出现冲突。__init__.py 可以通过定义__all__变量来控制导入时的名称空间。

    # __init__.py
    __all__ = ['module1''module2']

    这样导入包时,只有在 __all__ 中列出的模块会被导入,避免了潜在的名称冲突

6. 路由加载

6.1 路由文件

假如我们在app/router目录下有以下几个文件:

➜  tree -L 2 app/router  -I "__pycache__"
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!"
    }

6.2 官方加载示例

文档地址: https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/#fastapi

在主体文件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!"}

6.2 优化导入

1.编辑app/router/__init__.py
from app.router import default_router, demo_router

# 定义路由列表
RegisterRouterList = [
    default_router,
    demo_router
]

__init__.py中定义变量,把要注册的路由统一放在列表中,然在main.py中通过循环加载路由;后续有新增路由时,直接在列表中新增元素即可;

2.修改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)

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为忙碌的软件工程师精心准备的编码面试准备材料,超过 100,000 人受益!

这是一个针对技术面试准备的手册。它收集了大量的面试问题和答案,涵盖了算法、系统设计、前端等主题,并且还在不断更新和完善中。 这个项目是“Tech Interview Handbook”,解决了求职者在技术面试中遇到的各种难题,帮助他们更好地…

将scut-seg标签转化成通用coco标签

行人实例分割 import json import osdef calculate_bounding_rectangle(coordinates):# 提取x和y坐标的列表x_coords [coord[0] for coord in coordinates]y_coords [coord[1] for coord in coordinates]# 计算矩形的左上角坐标min_x min(x_coords)min_y min(y_coords)# 计…

C++ Qt 学习(六):Qt http 编程

1. http 基础 HTTP 基础教程C Web 框架 drogonoatpp 2. C Qt 用户登录、注册功能实现 login_register.h #pragma once#include <QtWidgets/QDialog> #include "ui_login_register.h" #include <QNetworkReply>class login_register : public QDialog…

开源网安受邀参加网络空间安全合作与发展论坛,为软件开发安全建设献计献策

​11月10日&#xff0c;在广西南宁举办的“2023网络空间安全合作与发展论坛”圆满结束。论坛在中国兵工学会的指导下&#xff0c;以“凝聚网络空间安全学术智慧&#xff0c;赋能数字经济时代四链融合”为主题&#xff0c;邀请了多位专家及企业代表共探讨网络安全发展与数字经济…

《网络协议》05. 网络通信安全 · 密码技术

title: 《网络协议》05. 网络通信安全 密码技术 date: 2022-09-10 15:16:15 updated: 2023-11-12 07:03:52 categories: 学习记录&#xff1a;网络协议 excerpt: 网络通信安全&#xff08;ARP 欺骗&#xff0c;DoS & DDoS&#xff0c;SYN 洪水攻击&#xff0c;LAND 攻击&a…

MVC使用的设计模式

MVC使用的设计模式 一、背景 MVC模式是"Model-View-Controller"的缩写&#xff0c;中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View&#xff0c;或者同时改变两者。只要Controller改变了Model…

计算机、通信及信号处理领域各单位的期刊与会议分级

中国计算机学会推荐国际学术会议和期刊目录-2022 CCF2022分类下载地址 清华大学计算机学科群推荐学术会议和期刊列表&#xff08;TH-CPL-2019&#xff09; TH-CPL2019下载地址 北京大学高能效计算与应用中心A类论文源-2016 CECA分级链接 中国通信学会《信息通信领域高质量科…

程序员的“脸红“代码时刻

身为程序员哪一个瞬间让你最奔溃&#xff1f; 在程序员的世界里&#xff0c;有这样一种特殊的“魔咒”&#xff0c;它不需要任何复杂的咒语&#xff0c;只需一个字母的错误拼写&#xff0c;就能让最硬核的代码战士们红着脸&#xff0c;崩溃地按下退格键。这就是程序员最尴尬的…

5个用于地理空间数据分析的Python包

大家好&#xff0c;地理空间数据分析在城市规划、环境研究、农业和交通等行业中至关重要。不断增长的需求导致Python包在各种地理数据分析要求上的使用增加&#xff0c;例如分析气候模式、研究城市发展或跟踪疾病传播等&#xff0c;评估和选择具有快速处理、修改和可视化能力的…

【Liunx】部署Ansible自动化运维工具

Ansible自动化运维工具 概述安装部署1.通过yum下载Ansible2.对自己做免密配置3.修改ansiable host配置对服务器进行分组4.测试&#xff1a;对所有服务器进行ping命令5.写playbook6.执行我们写的playbook脚本7.验证 概述 ansible是新出现的自动化运维工具&#xff0c;基于Pytho…

Python math 标准库学习总结

math --- 数学函数 该模块提供了对C标准定义的数学函数的访问。 这些函数不适用于复数&#xff1b;如果你需要计算复数&#xff0c;请使用 cmath 模块中的同名函数。将支持计算复数的函数区分开的目的&#xff0c;来自于大多数开发者并不愿意像数学家一样需要学习复数的概念。…

IDEA安装配置SceneBuilder

1、下载 SceneBuilder 地址&#xff1a; Scene Builder - Gluon ​​​​​​​ Scene Builder | JavaFX中文官方网站 选择符合自己系统版本&#xff0c;JAVA版本的下载 2、安装SceneBuilder 执行下载的 SceneBuilder 安装程序&#xff0c;并按照安装向导的指示进行…

Linux内核分析(十四)--内存管理之malloc、free 实现原理

目录 一、引言 二、malloc实现方式 ------>2.1、动态内存分配的系统调用:brk / sbrk ------>2.2、malloc实现思路 ------------>2.2.1、最佳适应法 ------------>2.2.2、最差适应法 ------------>2.2.3、首次适应法 ------------>2.2.4、下一个适应…

701. 二叉搜索树中的插入操作

原题链接&#xff1a;701. 二叉搜索树中的插入操作 思路&#xff1a; 因为是二叉搜索树&#xff0c;我们可以利用这个特性来确定val到底是在那一边的子树&#xff0c;而不是全部遍历二叉搜索树 直接使用递归&#xff0c;如果查询到root为NULL&#xff0c;则直接创建新结点即可…

[linux] 由创建用户开始

用户创建 【添加用户】 方案一&#xff08;自动化添加&#xff09;&#xff1a;adduser <用户名> 后按提示设计密码、全名等 方案二&#xff08;个性化添加&#xff09;&#xff1a;useradd -m <用户名>&#xff0c; 设置密码 passwd <用户名>。当出现切换用…

Feign调用返回值统一处理

因为接口一般有固定的返回格式&#xff0c;有数据、返回码和异常时错误信息。 不做任何处理情况下&#xff0c;需要在调用Feign的业务代码处通过判断返回码来获取数据。这种重复的代码可以抽出来统一处理。 解决方法1 使用自定义Decoder来统一处理&#xff0c;重写Object de…

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点&#xff0c;使得攻击者无法发现恶意攻击的目标网络资源&#xff0c;从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等&#xff0c;帮助游戏、金 融、电子商务、互联网、政企等行业抵…

实际使用Elasticdump工具对Elasticsearch集群进行数据备份和数据还原

文/朱季谦 目录一、Elasticdump工具介绍二、Elasticdump工具安装三、Elasticdump工具使用 最近在开发当中做了一些涉及到Elasticsearch映射结构及数据导出导入的工作&#xff0c;怕以后会把这过程忘记&#xff0c;可谓好记性不如烂笔头&#xff0c;故而记录成一篇博文。 玩El…

CCF编程能力等级认证GESP—C++4级—样题1

CCF编程能力等级认证GESP—C4级—样题1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)第一题 绝对素数第二题 填幻方 参考答案单选题判断题编程题1编程题…

上海某公司医疗实施工程师笔试题

文章目录 一、Oracle数据库基础二、作为一个实施人员&#xff0c;用户如果提出我们软件功能所不具备的需求&#xff0c;你该如何处理&#xff1f;简单列出你可能采取的几种措施三、简答题三、答案1.Oracle数据库基础2.作为一个实施人员&#xff0c;用户如果提出我们软件功能所不…