FastAPI前置知识及快速入门

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 Unionif __name__ == '__main__':"""基本数据类型"""# python<3.6num1 = 100content1 = "一段内容...."hasMoney1 = TruePI1 = 3.14# python >=3.6num2: int = 100content2: str = "一段内容...."hasMoney: bool = TruePI2: 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 datetimedate1: datetime = datetime.now()class Humen(object):passclass Student(Humen):passxiaoming1: 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 dataif __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.xdnf.cn/news/1549740.html

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

相关文章

JNI实现Java调用C++函数

1. 测试环境 操作系统&#xff1a;win10JDK版本&#xff1a;JDK11 安装教程gcc版本&#xff1a;8.1.0 2. 声明native方法 // HelloJNI.java public class HelloJNI {// 输出Hello JNI from CPP. private native static void sayHello();// 实现两个整数相加private native s…

Java基础扫盲(二)

想看Java基础扫盲&#xff08;一&#xff09;的可以观看我的上篇文章Java基础扫盲 目录 String为什么设计为不可变的 String有长度限制吗 为什么JDK9将String的char[]改为byte[] 泛型中K,T,V,E,Object,?等都代表什么含义 怎么修改一个类中使用了private修饰的String类型…

Java基于相似算法实现以图搜图

一、简述 本文主要讲如何利用图片相似性算法&#xff0c;基于LIRE来实现图片搜索。 二、依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><…

7.MySQL内置函数

目录 日期函数时间函数字符串函数数学函数其他函数 日期函数 函数名称描述current_date()当前日期current_time()当前时间current_timesamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date, interval d_value_tyep)在date中添加日期函数或时间。interval后…

项目计划软件如何助力企业策略规划和执行监控

项目管理软件助力任务、时间和协作管理&#xff0c;如ZohoProjects集成了任务管理、时间跟踪、协作工具等功能&#xff0c;提高性价比&#xff0c;适合不同规模团队。其简化流程、专业度高&#xff0c;成为企业提升效率的重要工具。 一、项目计划软件的由来 项目计划软件的历史…

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…

Cookie、Session、Token(JWT)还不懂?

Cookie、Session、Token&#xff08;JWT&#xff09; 三者的区别与用途&#xff01;如何进行身份认证&#xff0c;保持用户登录状态&#xff1f; Cookie、Session 和 Token 都是在 Web 开发中用于管理用户状态和进行身份认证的技术&#xff0c;它们之间有以下区别和用途&#…

一步步带你Linux内核编译与安装

Linux内核编译与安装 安装流程 #mermaid-svg-0PfY2uowOUJaN2Ov {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-icon{fill:#552222;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-text{fill:#5522…

地区环境保护支出数据(2007-2023年)

政府环境保护支出是指ZF在环境保护方面投入的CZ资金&#xff0c;用于自然生态保护、污染防治、环境监测与监管等多个领域&#xff0c;旨在改善环境质量、防范环境风险以及促进可持续发展 一、数据介绍 数据名称&#xff1a;地区环境保护支出数据 数据范围&#xff1a;中国31…

yakit使用教程(二,配置证书并进行抓包改包操作)

前文链接&#xff1a;yakit下载安装教程。 一&#xff0c;下载并配置证书。 点击mitm&#xff0c;在跳转后的页面点击高级配置。 点击证书下载。 点击下载到本地并打开&#xff08;建议下载到桌面&#xff09;。 在火狐浏览器下载并安装FoxyProxy&#xff0c;具体参数配置如上…

一文上手skywalking【上】

一、skywalking预览 1.1 skywalking 概述 ​ Apache SkyWalking, 适用于分布式系统的应用程序性能监控工具&#xff0c;专为微服务、云原生和基于容器的 &#xff08;Kubernetes&#xff09; 架构而设计。官方地址: https://skywalking.apache.org/ 适用于分布式系统的应用程…

Humans or LLMs as the Judge? A Study on Judgement Bias

文章目录 题目摘要引言相关作品论法官的偏见实验方案结果与讨论欺骗LLM法官结论 题目 人类还是LLMs作为裁判&#xff1f;判断偏差研究 论文地址&#xff1a;https://arxiv.org/pdf/2402.10669 摘要 采用人类和大型语言模型(LLM)作为评估LLM性能的评判者(也称为人类和LLM-as-a…

Java语法-类和对象之抽象类和接口

1.抽象类 1.1 抽象类的概念 一个类中没有足够的信息来描述一个具体的对象,这样的类就是抽象类 比如: 从图中我们可以看出,只有继承了的类,我们产生的实例,调用的draw方法都是他们本身重写的draw方法,不会调用父类Shape的draw()方法,因此我们可以不管父类里面的draw()方法里面的…

第十四届蓝桥杯真题Java c组A.求和(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;蓝桥杯关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 【问题描述】 求1(含)至 20230408(含)中每个数的和。 【答案提交】 这是一道结…

24年下重庆事业单位考试报名超详细流程

&#x1f388;提交报考申请 考生通过重庆市人力资源和社会保障局官网&#xff08;rlsbj.cq.gov.cn&#xff09;“热点服务”中“人事考试网上报名”栏进行报名。报名时间为2024年8月12日9:00—8月17日9:00。 &#x1f388;网上缴费 资格初审合格后&#xff0c;考生应在2024年8…

flink设置保存点和恢复保存点

增加了hdfs package com.qyt;import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.runtime.state.storage.FileSystemCheckpointStorage;import org.apache.flink.streaming.api.datastream.Dat…

精通推荐算法32:行为序列建模总结

1 行为序列建模总体架构 2 行为序列整体总结 用户行为序列建模是推荐算法中至关重要的一环&#xff0c;也是目前较为核心和前沿的研究方向。其主要分为短序列建模和长序列建模两大方向。短序列建模又主要分为池化和序列化两种方式&#xff0c;其中池化包括Sum-Pooling、Averag…

信道衰落的公式

对于天线&#xff1a; 对于天线的面积计算&#xff1a; 天线的接收功率密度&#xff1a; 天线的接收功率&#xff1a; 移动无线信道&#xff08;I&#xff09; (xidian.edu.cn)https://web.xidian.edu.cn/zma/files/20150710_153736.pdf 更加常用的考虑了额外的信道衰落pathlo…

甘肃辣椒油:舌尖上的热辣诱惑

&#x1f4a5;宝子们&#xff0c;今天必须要给你们安利甘肃食家巷的辣椒油&#x1f336;️&#xff01;✨甘肃辣椒油&#xff0c;那可是有着独特魅力的美食瑰宝&#x1f60d;。它以其鲜艳的色泽、浓郁的香气和醇厚的辣味&#xff0c;瞬间点燃你的味蕾&#x1f525;。&#x1f3…

《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》

文章目录 自定义异常类AppException封装业务有关的枚举类AppExceptionCodeMsg全局异常拦截器Handler响应类模板Resp案例展示 || Demo项目结构pom依赖DemoController实际执行结果 Demo案例Git地址 | Gitee 本文主要介绍自己在工作中在处理抛出异常类和封装响应类处理的模板总结。…