FastAPI前置知识及快速入门

news2024/11/16 23:29:33

FastAPI

在这里插入图片描述

fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。

fastapi是建立在Starlette和Pydantic基础上的,Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包,是构建高性能Asyncio服务的理性选择。

特点:

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 StarlettePydantic),是最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档

依赖:Python 3.6 及更高版本,FastAPI 站在以下巨人的肩膀之上

在这里插入图片描述

FastAPI的核心:

Starlette 负责 web 部分(Asyncio)

Pydantic 负责数据部分(类型提示)

FastApi是站在前人肩膀上,集成了多种框架的优点的新秀框架。它出现的比较晚,2018年底才发布在github上。广泛应用于当前各种前后端分离的项目开发,测试运维自动化以及微服务、大模型开发的场景中。

一、前置知识点

1.0 常见的web框架

web框架
重量级框架
轻量级框架
Django
过去
Flaskv_1.x
Tornado
Twisted
现在
Flask_2.x
FastAPI
tornado
重量级框架:追求大而全,适合开发中大型企业级项目,不适合开发小型项目,默认提供了项目结构结构,内置大量的插件便于开发者进行项目构建,运行速度比不上轻量级框架。
轻量级框架:追求小而巧,适合开发中小型项目,也可以开发企业级大项目,但是考验开发人员的代码组织能力,本身并不提供目录结构,所有的项目代码都是开发人员定制编写的。

1.1 Typing类型标注

python3.6以后新增了Python PEP484,python语法支持给变量提供类型的标注。这种标准可以让开发人员更容易的查看到当前变量值的数据类型。main.py,代码:

from typing import Union

if __name__ == '__main__':
    """基本数据类型"""
    # python<3.6
    num1 = 100
    content1 = "一段内容...."
    hasMoney1 = True
    PI1 = 3.14

    # python >=3.6
    num2: int = 100
    content2: str = "一段内容...."
    hasMoney: bool = True
    PI2: float = 3.14

    """符合类型"""
    """python<3.6"""
    list1 = []
    list2 = [1, 2, 3, 4]
    list3 = ["a", "b", "c", "d"]
    list4 = ["a", True, "c", 3.5]

    set1 = set()
    set2 = {3, 5, 6}
    set3 = {"A", "B", "C"}
    set4 = {True, "B", 100}

    t1 = ()
    t2 = (1, 3, 5)
    t3 = ("A", "B", "C")
    t4 = (True, "B", 300)

    d1 = {}
    d2 = {"a": 100, "b": 200}
    d3 = {"a": [], "b": "1200"}
    # 字典的key不支持可变类型
    d4 = {(1, 2): [], (3.4, 4.7): "1200"}

    """python>=3.6"""
    list11: list = []
    list21: list = [1, 2, 3, 4]
    list22: list[int] = [1, 2, 3, 4]
    list31: list = ["a", "b", "c", "d"]
    list32: list[str] = ["a", "b", "c", "d"]
    list41: list = ["a", True, "c", 3.5]
    list42: list[any] = ["a", True, "c", 3.5]

    set11: set = set()
    set21: set = {3, 5, 6}
    set22: set[int] = {3, 5, 6}
    set31: set = {"A", "B", "C"}
    set32: set[str] = {"A", "B", "C"}
    set41: set = {True, "B", 100}
    set42: set[any] = {True, "B", 100}

    t11: tuple = ()
    t21: tuple = (1, 3, 5)
    t22: tuple[int, int, int] = (1, 3, 5)
    t31: tuple = ("A", "B", "C")
    t32: tuple[str, str, str] = ("A", "B", "C")
    t41: tuple = (True, "B", 300)
    t42: tuple[bool, str, int] = (True, "B", 300)

    d11: dict = {}
    d21: dict = {"a": 100, "b": 200}
    d22: dict[str, int] = {"a": 100, "b": 200}
    d31: dict = {"a": [], "b": "1200"}
    d32: dict[str, any] = {"a": [], "b": "1200"}
    d33: dict[str, Union[list, str]] = {"a": [], "b": "1200"}
    d41: dict = {(1, 2): [], (
    3.4, 4.7): "1200"}  # d41: dict[Union[list[int], list[float]], Union[list, str]] = {[1, 2]: [], [3.4]: "1200"}

    """对象/类/模块"""
    from datetime import datetime

    date1: datetime = datetime.now()


    class Humen(object):
        pass


    class Student(Humen):
        pass


    xiaoming1: object = Student()
    xiaoming2: Humen = Student()
    xiaoming3: Student = Student()

1.2、http协议

1. 什么是请求头请求体,响应头响应体
2. URL地址包括什么
3. get请求和post请求到底是什么
4. Content-Type是什么
1.2.1 简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

在这里插入图片描述

1.2.2 http协议特性
(1) 基于TCP/IP协议

http协议是基于TCP/IP协议之上的应用层协议。

(2) 基于请求-响应模式

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

(3) 无状态保存

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。

(4) 短连接

HTTP1.0默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
HTTP/1.1起,默认使用长连接。要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,才能支持长连接。
HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。
1.2.3 http请求协议与响应协议

在这里插入图片描述

http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。用于HTTP协议交互的信被为HTTP报文。请求端(客户端)的HTTP报文 做请求报文,响应端(服务器端)的 做响应报文。HTTP报文本身是由多行数据构成的字文本。

在这里插入图片描述

一个完整的URL包括:协议、ip、端口、路径、参数

例如: https://www.baidu.com/s?wd=moluo 其中https是协议,www.baidu.com 是IP,端口默认80,/s是路径,参数是wd=moluo

请求方式: get与post请求

  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制

响应状态码:状态码的职责 是当客户端向服务器端发送请求时, 返回的请求 结果。借助状态码,用户可以知道服务器端是正常 理了请求,还是出 现了 。状态码如200 OK,以3位数字和原因 组成。

1.3、api接口

在开发Web应用中,有两种应用模式:

  1. 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]

在这里插入图片描述

  1. 前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可)】

前端形成一个独立的网站,服务端构成一个独立的网站

在这里插入图片描述

应用程序编程接口(Application Programming Interface,API接口),就是应用程序对外提供了一个操作数据的入口,这个入口可以是一个函数或类方法,也可以是一个url地址或者一个网络地址。当客户端调用这个入口,应用程序则会执行对应代码操作,给客户端完成相对应的功能。

当然,api接口在工作中是比较常见的开发内容,有时候,我们会调用其他人编写的api接口,有时候,我们也需要提供api接口给其他人操作。由此就会带来一个问题,api接口往往都是一个函数、类方法、或者url或其他网络地址,不管是哪一种,当api接口编写过程中,我们都要考虑一个问题就是这个接口应该怎么编写?接口怎么写的更加容易维护和清晰,这就需要大家在调用或者编写api接口的时候要有一个明确的编写规范!!!

为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们都需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少客户端开发人员和服务端开发人员双方之间的合作成本和沟通成本。

目前市面上大部分公司开发人员使用的接口实现规范主要有:restful、RPC。

REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士毕业论文中。

RESTful是一种专门为Web 开发而定义API接口的设计风格,尤其适用于前后端分离的应用模式中。

关键:面向资源开发

这种RESTful风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。

而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。

请求方法代表动作请求地址代表资源服务端要进行的操作
POST/student/增加学生
GET/student/获取所有学生
GET/student/1获取id为1的学生
PUT/student/1修改id为1的学生
DELETE/student/1删除id为1的学生
DELETE/student/删除所有学生

restful规范是一种通用的规范,不限制语言和开发框架的使用。事实上,我们可以使用任何一门编程语言,任何一个开发框架都可以实现符合restful规范的API接口。

二、快速入门

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

FastAPI代码仓库:https://github.com/tiangolo/fastapi

2.1 安装

强烈建议学习过程中,使用Linux系统学习,终端下使用以下命令安装FastAPI框架的核心模块

pip install fastapi -i https://pypi.tuna.tsinghua.edu.cn/simple

确认是否安装成功:

pip freeze | grep fastapi
# window下:
pip freeze | findstr fastapi

2.2 快速体验

编写一个python作为项目访问接口,main.py代码

# 1. 导入核心模块
from fastapi import FastAPI
from fastapi.responses import JSONResponse

# 2. 创建web应用程序的实例对象
app = FastAPI()

# 3. 创建一个函数,提供给外界使用,这就是API接口
async def main():
    data = {"name": "xiaoming", "age": 17}
    return JSONResponse(data)

# 4. 绑定url和函数,允许外界通过url地址访问上面的函数
app.add_api_route(path="/", endpoint=main, methods=["GET"])

启动运行FastAPI项目,我们提供一个web服务器,实现网络通信,允许客户端通过http协议访问项目,需要安装uvicorn,代码:

# ASGI  web 服务器
pip install uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成以后,直接入口文件中,直接调用uvicorn的测试服务器启动项目即可,main.py,代码:

# 1. 导入核心模块
from fastapi import FastAPI
from fastapi.responses import JSONResponse

# 2. 创建web应用程序的实例对象
app = FastAPI()

# 3. 创建一个函数,提供给外界使用,这就是API接口
async def main():
    data = {"name": "xiaoming", "age": 17}
    return JSONResponse(data)

# 4. 绑定url和函数,允许外界通过url地址访问上面的函数
app.add_api_route(path="/", endpoint=main, methods=["GET"])

if __name__ == '__main__':
    # 5. 启动项目
    import uvicorn
    # uvicorn.run("访问入口的模块名:实例对象", host="0.0.0.0", port=端口, reload=True)
    uvicorn.run("main:app", reload=True)

执行效果:

在这里插入图片描述

2.3 运行项目

除了上面在代码使用uvicorn.run()启动项目以外,还可以在终端下使用命令来启动项目(这种启动项目的方式是在工作中公司的项目正式上线以后,必须使用的启动方式),Terminal,命令:

# 使用cd切换工作路径到入口文件处
cd xxx
uvicorn main:app --reload   # main就是入口文件main.py,app就是main.py中FastAPI类实例化后的对象名

执行效果:

在这里插入图片描述

上面的运行操作,是使用了默认地址和端口来启动项目,也可以监听其他的地址和端口。

uvicorn main:app --host=0.0.0.0 --port=8888 --reload

执行效果:

在这里插入图片描述

2.4 绑定路由

main.py,代码:

# 1. 导入核心模块
from fastapi import FastAPI

# 2. 创建web应用程序的实例对象
app = FastAPI()


# 3. 创建一个函数,提供给外界使用,这就是API接口
@app.get("/")
async def main():
    data = {"name": "xiaoming", "age": 145}
    return data

if __name__ == '__main__':
    # 5. 启动项目
    import uvicorn
    # uvicorn.run("访问入口的模块名:实例对象", host="0.0.0.0", port=端口, reload=True)
    uvicorn.run("main:app", reload=True)

在上面,不管使用了app.add_api_router()还是使用app.get()来绑定访问接口的地址,这个过程都是FastAPI中的路由组件(routers)所完成的。

路由(Router)

路由(Router),实际上是一种资源绑定的映射关系,在FastAPI中,路由就是让用户可以通过http请求与url地址来访问接口函数的工具类。

我们可以通过以下代码查看FastAPI中一共有多少接口被注册到路由中了。

# 1. 导入核心模块
from fastapi import FastAPI

# 2. 创建web应用程序的实例对象
app = FastAPI()


# 3. 创建一个函数,提供给外界使用,这就是API接口
@app.get("/")
async def main():
    data = {"name": "xiaoming", "age": 145}
    return data

# 查看当前项目中已经注册路由的
print(app.routes)
"""
[
    Route(path='/openapi.json', name='openapi', methods=['GET', 'HEAD']),  # 原生API接口的数据显示风格
    Route(path='/docs', name='swagger_ui_html', methods=['GET', 'HEAD']),  # swagger_ui风格的API接口文档
    Route(path='/docs/oauth2-redirect', name='swagger_ui_redirect', methods=['GET', 'HEAD']),  # 
    Route(path='/redoc', name='redoc_html', methods=['GET', 'HEAD']),  # redoc风格的API接口文档
    APIRoute(path='/', name='main', methods=['GET'])] # 这就是我们上面自定义的接口方法了
"""
if __name__ == '__main__':
    # 5. 启动项目
    import uvicorn
    # uvicorn.run("访问入口的模块名:实例对象", host="0.0.0.0", port=端口, reload=True)
    uvicorn.run("main:app", reload=True)

2.5 接口文档

在上面我们编写了一个API接口,并允许了外界可以通过url地址进行访问,但是在正常的工作中, 我们会编写很多很多的API接口,那么如何让团队内部的其他同事能快速了解我们当前在FastAPI里面都写了哪些接口呢?这就需要我们提供一份充分的API接口使用文档了。FastAPI中默认对项目中所有编写的API接口都提供了2款不同风格的API接口文档,允许客户端进行阅览的。

2.5.1 swagger_ui风格的接口文档

直接访问:http://127.0.0.1:8000/docs

在这里插入图片描述

2.5.2 redoc风格的接口文档

直接访问:http://127.0.0.1:8000/redoc

在这里插入图片描述

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

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

相关文章

MyBatis——Plus——入门

常用注解 MyBatis——Plus怎么知道他是访问哪张表 常用配置

Codeforces Round 975 (Div. 2)

传送门&#xff1a;https://codeforces.com/contest/2019 B. All Pairs Segments 题意&#xff1a; 首先样例解释一下&#xff1a; 一共有&#xff1a;[1,2],[1,3],[1,5],[1,6],[1,7],[2,3],[2,5],[2,6],[2,7],[3,5],[3,6],[3,7],[5,6],[5,7],[6,7] 点 1&#xff0c;7 在5个…

Android SQLite的基本使用、生成Excel文件保存到本地

1. Android SQLite的基本使用 1.1. SQLiteOpenHelper Android 底层已经通过一个SQLiteOpenHelper的抽象类将数据库的创建&#xff0c;以及修改&#xff0c;更新等都放在了里面。 要使用它必须实现它的OnCreate(SQLiteDatabase db)&#xff0c;onUpgrade(SQLiteDatabase db, int…

一些硬件知识(二十五)

cadence设置led颜色&#xff1a; 切换到Current propeties才会有颜色选选项&#xff0c;点击红色就可以选择其他的颜色&#xff1a; 手机字库是维修人员对FLASH MEMORY的俗称&#xff0c;其真实名字是闪速存储器&#xff0c;简称闪存&#xff0c;相当于手机的“硬盘”&#xff…

【Linux网络】详解TCP协议(3)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux网络 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 TCP的流量控制和滑动窗口 的相关内容。 如果看到最后您觉得这篇…

VB.net读写NDEF标签URI智能海报WIFI蓝牙连接

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 Public Class Form1Dim oldpicckey(0 To 5) As Byte 卡片旧密码Dim newpicckey(0 To 5) As Byte 卡片新密码Function GetTagUID() As StringDim status As ByteDim myctrlword As …

Android手机投屏方案实现方式对比

文章目录 1.概述2.术语解释2.1 miracast2.2 scrcpy2.4 Wifi Direct2.5 app_process 3.技术实现对比3.1 Miracast3.1.1 Miracast介绍3.1.2 Miracast原理3.1.3 Miracast优缺点分析 3.2 Scrcpy3.2.1 scrcpy 介绍3.2.2 scrcpy的实现原理3.2.3 scrcpy的优缺点分析 3.3 Google cast3.…

Nisshinbo日清纺pvs1114太阳模拟器手测

Nisshinbo日清纺pvs1114太阳模拟器手测

影响上证50股指期货价格的因素有哪些?

上证50股指期货&#xff0c;作为反映上海证券交易所最具代表性50只股票整体表现的期货合约&#xff0c;其价格同样受到一系列复杂因素的驱动。以下是对影响上证50股指期货价格的主要因素进行的详细分析。 因素一、期货合约的供求关系 股指期货市场是一个由多头和空头双方共同…

关于AI副业,能说的都说了(最核心3大赛道、机会、方向)

AI&#xff0c;是生产力工具~ AI&#xff0c;也是焦虑和痛点 一直有小伙伴在问AI副业的事儿&#xff0c;之前也分享过很多。 但是&#xff0c;很多人对AI于副业的作用&#xff0c;过于表面和形式&#xff0c;所以&#xff0c;狂金来叨叨一下最核心的3大赛道&#xff0c;希望…

腾讯云SDK购买流程

音视频终端 SDK 需购买对应 License/套餐获得使用授权&#xff0c;本文将对购买 License/套餐的操作进行详细指引。 您可首先参考计费概述 确认您需要购买的内容&#xff0c;随后参考本文进行购买。本文仅提供 SDK 授权费用所需资源的购买&#xff0c;如果您需要使用其他相关云…

深入浅出MySQL事务处理:从基础概念到ACID特性及并发控制

1、什么是事务 在实际的业务开发中&#xff0c;有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行&#xff0c;要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败&#xff0c;就进行事务的回滚&a…

回答网友一个数据显示的问题

事情是这个样子的 俺在一个C# 群里&#xff0c;一个问:"打开form2&#xff0c;可以同步显示form1的表格内容&#xff0c;在form2增删改表格内容之后&#xff0c;可以同步到form1中"。 俺 打开 delphi 放了几个 数据敏感 控件&#xff0c;演示了一下。还说了 一行…

Windows环境下训练开源图像超分项目 ECBSR 教程

ECBSR 介绍 ECBSR&#xff08;Edge-oriented Convolution Block for Real-time Super Resolution&#xff09;是一种针对移动设备设计的轻量级超分辨率网络。它的核心是一种可重参数化的构建模块&#xff0c;称为边缘导向卷积块&#xff08;ECB&#xff09;&#xff0c;这种模…

数集相等定义凸显“R各元x的对应x+1的全体=R”是几百年重大错误

黄小宁 变量x所取各数也均由x代表&#xff0c;x代表其变域&#xff08;x所有能取的数组成的集&#xff09;内任一元。设集A&#xff5b;x&#xff5d;表A各元均由x代表&#xff0c;&#xff5b;x&#xff5d;中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标所以x∈R变换…

详解ES5中的数组方法

7.9 ES5中的数组方法 ECMAScript 5定义了9个新的数组方法来遍历、映射、过滤、检测、简化、搜索数组。 7.9.1 forEach() 7.9.2 map() 将调用的数组的每个元素传递给指定的函数&#xff0c;并返回一个数组&#xff0c;包含函数的返回值。 例如数组的每个元素的立方&#xf…

基于SpringBoot+Vue的大学生勤工助学兼职管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

防砸安全鞋这样挑,舒适又安心!

在复杂多变的工作环境中&#xff0c;安全始终放在首位&#xff0c;特别是对于那些在工地、车间等危险环境中工作的朋友们来说&#xff0c;一双好的防砸安全鞋无疑是工作中的“守护神”。然而&#xff0c;市面上的防砸安全鞋种类繁多&#xff0c;如何挑选一双既舒适又安心的鞋子…

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、解决方法1. 添加项目设置碰撞检测通道2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时&#xff0c;我们使用刀剑等武器攻击怪物或敌方单位时&#xff0c;发现攻击特效…