Python高性能web框架--Fastapi快速入门

文章目录

  • fastapi框架
    • 一、预备知识点
      • 1.1、http协议
        • 一、简介
        • 二、 http协议特性
        • 三、http请求协议与响应协议
      • 1.2、api接口
    • 二、quick start
      • 简单案例

fastapi框架

在这里插入图片描述

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

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

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

依赖:Python 3.6 及更高版本,FastAPI 站在以下巨人的肩膀之上
在这里插入图片描述

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

Pydantic使用来处理数据的,它可以将前端传来的数据转换成之前定义好的类里面的数据类型

案例:

from datetime import datetime

from pydantic import BaseModel, PositiveInt


#构造数据模型
class User(BaseModel):
    #类型声明
    id: int
    name: str = 'John Doe'  #相当于有默认值的,John Doe
    signup_ts: datetime | None
    tastes: dict[str, PositiveInt]


#模拟前端传给后端的数据
external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'tastes': {
        'wine': 9,
        b'cheese': 7,
        'cabbage': '1',
    },
}

#BaseModel类的强大之处在于,可以将数据进行转换,转换成类里面声明的相关数据类型
user = User(**external_data)

print(user.id)
#> 123
print(user.model_dump())

我们看下前端传来的数据,明显不是类User里面定义的数据类型
但是,Pydantic里面的BaseModel可以转换
我们运行下代码,看下打印,已经将123字符串类型转换为int类型,将字符串日期转换成日期类型
在这里插入图片描述

但是,如果我们传递的类型不能通过类型转换,就会报错
在这里插入图片描述

#user是个对象
print(user,type(user))
#将对象转换成字典
print(user.dict())
在这里插入图片描述

一、预备知识点

1.1、http协议

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

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

二、 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连接建立和断开的消耗。

三、http请求协议与响应协议

在这里插入图片描述

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

一个完整的URL包括:协议、ip、端口、路径、参数
例如: https://www.baidu.com/s?wd=yuan 其中https是协议,www.baidu.com 是IP,端口默认443,/s是路径,参数是wd=yuan
请求方式: get与post请求

  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制
    响应状态码:状态码的职 是当客户端向服务器端发送请求时, 返回的请求 结果。借助状态码,用户可以知道服务器端是正常 理了请求,还是出 现了 。状态码如200 OK,以3位数字和原因 组成。

1.2、api接口

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

  1. 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]
    在这里插入图片描述

我们使用socket,来创建一个web应用程序

import socket

sock = socket.socket()
sock.bind(('127.0.0.1',8080))
sock.listen(128)

while True:
    con,addr = sock.accept() #阻塞等待客户端连接
    data = con.recv(1024)
    print('客户端发来的信息',data)
    con.send(b'HTTP/1.1 200 ok\r\nserver:jingtian\r\ncontent-type:application/json\r\n\r\n{serverdata:hello,world}')
    con.close()

浏览器访问
拿到数据
在这里插入图片描述

看下我们设置的响应头
在这里插入图片描述

但是,我们每次如果都手动写请求,响应,那对开发来说将显得非常麻烦,因此我们迫切需要web开发框架来简化我们得开发步骤。

  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接口的设计风格,尤其适用于前后端分离的应用模式中。
关键:面向资源开发
这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。
而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动作来表达对数据的增删查改。
在这里插入图片描述

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

二、quick start

简单案例

安装

pip install fastapi
在这里插入图片描述

你还会需要一个 ASGI 服务器,生产环境可以使用 Uvicorn
pip install uvicorn
在这里插入图片描述

from fastapi import FastAPI # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。

app = FastAPI() # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用

@app.get(“/”)
async def root():
return {“message”: “Hello jingtian”}

通过以下命令运行服务器:
uvicorn main:app --reload

INFO: Will watch for changes in these directories: [‘F:\pythonitems\myfastapi’]
INFO: Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
INFO: Started reloader process [18824] using StatReload
INFO: Started server process [1668]
INFO: Waiting for application startup.
INFO: Application startup complete.

也可以直接运行:

if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("quickstart:app", port=8080,  reload=True)

实战:

from fastapi import FastAPI  # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
import uvicorn

#创建应用程序,app是应用程序名
app = FastAPI()  # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用

#异步的请求参数,函数加上async。针对什么路由,就写上什么路径
@app.get("/")
async def home():
    return {"user_id": 1002}


@app.get("/shop")
async def shop():
    return {"shop": "商品信息"}


if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("quickstart:app", port=8080,  reload=True)

在浏览器,访问的时候,域名后面跟什么路由,就相应地只想server端配置的相关路由下面的函数
http://127.0.0.1:8080
在这里插入图片描述

http://127.0.0.1:8080/shop
在这里插入图片描述

此外,fastapi有着非常棒的交互式 API 文档,这一点很吸引人。

你将会看到自动生成的交互式 API 文档。

http://127.0.0.1:8080/docs
在这里插入图片描述

点一下try it out
在这里插入图片描述

点击Excute
在这里插入图片描述

可以拿到响应数据,响应头等数据
在这里插入图片描述
借助于web框架,我们开发人员只需要专注于业务本身,而无需为繁琐的格式费心费力,大大简化了我们得开发流程。

Fastapi开发web程序流程:
(1)导入 FastAPI。
(2)创建一个 app 实例。
(3)编写一个路径操作装饰器(如 @app.get(“/”))
(4)编写一个路径操作函数(如上面的 def root(): …)
(5)定义返回值
(6)运行开发服务器(如 uvicorn main:app --reload)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布(抽样分布) 2.5 t分布(抽样…

pytest钩子函数-pytest_runtest_logreport提取测试用例相关信息

问题:想在每个日志中记录测试用例开始结束时间,获取到测试用例的名称。 解决办法:使用钩子pytest_runtest_logreport 在pytest中,想要在conftest.py文件中获取正在运行的测试用例的名称,可以使用pytest_runtest_logre…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬,我又回来了,最近2月太忙啦(过年、奶娃、本子、材料、结题),断更了。现水一篇证明我还活着!!! 最近在写国自然本子,遇到一个估计大家都会遇到的问…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined,这是由于配置babel出错问题,由于使用了es7语法如async/await而当前babel版本过低 解决: npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置: &qu…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库: sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

【Node.js】自动生成 API 文档

目录 1、直接使用swagger-ui-express 2、配合swagger-jsdoc 如何在Node.js项目中使用 Swagger 来自动生成 API接口文档,使用生成方式有很多种。本文基于swagger-jsdocswagger-ui-express快速实现 1、直接使用swagger-ui-express // 方便来浏览和测试api npm i sw…

2023年12月CCF-GESP编程能力等级认证C++编程六级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共15题,共30分) 第1题 关于C++类和对象的说法,错误的是( )。 A:在C++中,一切皆对象,即便是字面量如整数5等也是对象 B:在C++中,可以自定义新的类,并实例化为新的对象 C:在C++中,…

再探二分法

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读二分查找题目思路解法左闭右闭式写法左闭右开式写法 二分查找 题目 给定一个…

单步调试Linux内核论证水位线watermark

哈喽,我是子牙,一个很卷的硬核男人 深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了这些课程:手写JVM、手写OS…

互联网加竞赛 机器视觉人体跌倒检测系统 - opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉人体跌倒检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数&…

nn.AdaptiveAvgPool3d的用法

#B,C,D,H,W->B,C,1,H,W self.adaptive_pool nn.AdaptiveAvgPool3d((1, None, None)) nn.AdaptiveAvgPool3d的Pytorch官方文档: https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html import torch import torch.nn as nn # target output size of …

JavaAPI常用类02

目录 基本数据类型封装类 包装类常用属性方法 8中基本数据类型各自所对应的包装类 以下方法以java.lang.Integer为例 代码 运行 装箱和拆箱 装箱 何为装箱 代码 范围问题 代码 运行 拆箱 代码 String类 概述 代码 运行 创建形式 画图讲解 代码 运行 构造…

挑战杯 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…

mac下使用jadx反编译工具

直接执行步骤: 1.创建 jadx目录 mkdir jadx2.将存储库克隆到目录 git clone https://github.com/skylot/jadx.git 3. 进入 jadx目录 cd jadx 4.执行编译 等待片刻 ./gradlew dist出现这个就代表安装好了。 5.最后找到 jadx-gui 可执行文件,双击两下…

Spring Cloud微服务网关Zuul过滤链实现的源码解读

一、Zuul过滤器的加载过程 Zuul网关的Filter需要经过初始化加载到Spring容器后,才能在请求中发挥作用: 在上篇文章:《Spring Cloud微服务网关Zuul的注解EnableZuulProxy或EnableZuulServer做了什么事情》 中说到的ZuulServerAutoConfigurati…

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…

windows安装git(全网最详细,保姆教程)

1.下载git(windows版本) 官网下载:Git - Downloads 点进去后,进入如下界面 2.安装git (1)找到下载到的文件,进行双击进行安装 (2)这里是安装前的使用说明, …

抖音博主老隋分享的temu蓝海项目怎么做更好?

很多网友在讨论老隋分享的temu蓝海项目,恰巧我也是通过抖音知道的这个项目,经过前段时间的系统学习temu的知识,加上我自己也是干过电商相关的工作,理解起来比较容易,下面我就用本文详细介绍一下抖音博主老隋分享的temu…

2024年2月22日 Go生态洞察:强化切片上的通用函数

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 专栏链接: 🔗 精选专栏:…
最新文章