当前位置: 首页 > news >正文

【Python】FastAPI入门

文章目录

  • 第一节:FastAPI入门
    • 一、FastAPI框架介绍
      • 什么是ASGI服务(WSGI)
      • 1、补充Web开发
        • 1)Web前端开发
        • 2)Web后端开发
    • 二、FastAPI安装
      • 1、安装Python虚拟环境
      • 2、安装FastAPI
    • 三、第一个FastAPI案例
      • 1、访问接口和文档
      • 2、接口文档半天打不开的解决
      • 3、总结
        • 1)uvicorn命令说明:
        • 2)app变量
        • 3)请求路径(路由)
        • 4)请求方法(操作)
        • 5)路由+请求方法 +函数的映射
        • 6)返回响应
    • 四、路由参数
      • 1、定义参数的类型
      • 2、路由匹配的顺序
      • 3、预设值参数

在这里插入图片描述

第一节:FastAPI入门

一、FastAPI框架介绍

FastAPI是一个现代、快速的Python Web框架,用于构建API。它基于Python 3.6+的类型提示特性,使得代码更加简洁且易于绶护。

关键特性:

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

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

更少 bug:减少约 40% 的人为(开发者)导致错误。
智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
简单:设计的易于使用和学习,阅读文档的时间更短。
简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
健壮:生产可用级别的代码。还有自动生成的交互式文档。
标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

FastAPI 站在巨人的肩膀上:

  • Starlette 用于构建 Web 部件:Starlette 是一个轻量级的 ASGI 框架和工具包,特别适合用来构建高性能的 asyncio 服务.
  • Pydantic 用于数据的操作:python 中用于数据接口定义检查与设置管理的库。

什么是ASGI服务(WSGI)

WSGI,(WEB SERVER GATEWAY INTERFACE),Web服务器网关接口,是一种Web服务器网关接口,它是一个Web服务器(如Nginx,uWSGI等服务器)与Web应用(如Flask框架写的程序)通信的一种规范。当前运行在WSGI协议之上的Web框架有Bottle,Flask,Django

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

WSGI和ASGI的区别

WSGI是基于HTTP协议模式的,不支持WebSocket,而ASGI的诞生则是为了解决Python常用的WSGI不支持当前Web开发中的一些新的协议标准。同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,即ASGI是WSGI的扩展。

1、补充Web开发

Web应用开发主要是建立在B/S架构模式下,衍生出来的一系列web应用程序,即主要是基于浏览器的应用程序开发,这也是web应用程序开发的基础,比如淘宝、京东、当当网等。Web开发在近年来,随着本身技术的突破以及移动设备的普及,基于web领域的开发,也出现了明确的岗位职责分工,一个web互联网产品中,基本上会分为web UI设计、Web前端开发以及web后端开发。

1)Web前端开发

Web前端开发用到的编程语言主要有javascript,以及伴随有标记性文本语言html和样式渲染方式CSS。以及近年来衍生出来的一批优秀web前端框架,使web前端在应用构建方面的效率得到显著提升。另外nodeJs的出现,越来越多的web前端开发人员开始走入服务端编程领域,甚至在一些项目中扮演着web全栈开发的角色。

2)Web后端开发

Web后端开发,主要用到的语言有python、php、java等,当然随着nodeJs的兴起,也成为近年来服务端开发的另一种选择。

Web应用程序开发是基于浏览器的,浏览器本身已经解决了多平台性兼容的问题,所以web开发一般是无需考虑跨平台所面临的兼容性问题。但是,web开发领域需要解决的有另一类问题,那便是多端兼容以及融合的问题,虽然web是基于浏览器的,没有跨平台的问题,但多端的快速发展,是web开发领域的新问题,即PC端、移动端以及当下比较火热的各类小程序端。

二、FastAPI安装

1、安装Python虚拟环境

为什么要使用虚拟环境

  1. 项目部署时,直接导出项目对应的环境中的库就可以了;
  2. 同时开发多个项目,各自项目使用的python版本不同,譬如一个是python2,另一个是python3,那么需要来回的切换python版本;
  3. 当你同时开发多个项目时,特别是多个项目使用同一个库,譬如:django,但是各自项目使用的django的版本不一致时,那么你在开发这些项目时,需要来回的卸载和安装不同的版本,因为同一个python环境中,同名的库只能有一个版本。

虚拟环境的安装步骤

  1. 安装好python环境

  2. 安装虚拟环境库,在cmd中输入:

    pip install virtualenv 
    
  3. 创建虚拟环境,在cmd中切换到需要创建虚拟环境的目录下,执行:

    virtualenv env_name 
    
  4. 激活虚拟环境,在cmd中进入到 第三步创建的 env_name/Scripts 目录下,执行:

    activate
    

    执行成功后,在cmd中,当前输入行前面会有 (env_name) 的前缀

    在当前状态下,使用 pip 就是在虚拟环境中安装第三方库了

  5. 退出虚拟环境,cmd中输入:

    deactivate
    

2、安装FastAPI

需要安装所有的可选依赖及对应功能,包括了 uvicorn,你可以将其用作运行代码的服务器。

pip install fastapi[all] -i https://pypi.douban.com/simple/

你也可以分开来安装。

假如你想将应用程序部署到生产环境,你可能要执行以下操作:

pip install fastapi

并且安装 uvicorn来作为服务器:

pip install "uvicorn[standard]"

三、第一个FastAPI案例

创建一个main.py

from fastapi import FastAPIapp = FastAPI()@app.get("/")
def root():return 'hello'@app.get("/hello/{name}")
def say_hello(name: str):return {"message": f"Hello {name}"}# 可以不要
if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

1、访问接口和文档

2、接口文档半天打不开的解决

这个接口文档调用了一个 js脚本,这个脚本是部署在国外的,总之 就是因为这个原因导致我们没法访问了,由此我们需要把这个脚本从网上下载下来,放到本地,把此处调用国外的脚本变成调用我们自己本地的,即可。

1)下载这些国外服务器的资源到一个static目录中

2)复制到项目中

3)修改fastapi的源代码

4) 在app中注册static目录

5)打开接口文档

3、总结

1)uvicorn命令说明:

uvicorn main:app 命令含义如下:

  • mainmain.py 文件(一个 Python「模块」)。
  • app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
  • --reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。
2)app变量

这里的变量 app 会是 FastAPI 类的一个实例 变量名字。这个实例将是创建你所有 API 的主要交互对象。

也可以修改app变量名字:

from fastapi import FastAPImy_awesome_api = FastAPI()@my_awesome_api.get("/")
def root():return {"message": "Hello World"}
3)请求路径(路由)

请求路径指的是 URL 中从第一个 / 起的后半部分。所以,在一个这样的 URL 中:

http://example.com/items/foo
http://127.0.0.1/items/foo

那么,真正的请求路径(路由)是:/items/foo

在FastAPI中,路由的配置是通过: 装饰器 完成的。

4)请求方法(操作)

在 HTTP 协议中,你可以使用以下的其中一种(或多种)请求方法 与每个路径进行通信。

通常使用:

  • POST:创建数据。
  • GET:读取数据。
  • PUT:更新数据。
  • DELETE:删除数据。
  • PATCH: 修改单一数据

配置请求方法:

  • @app.post()
  • @app.put()
  • @app.delete()
  • @app.get()

以及更少见的:

  • @app.options()
  • @app.head()
  • @app.patch()
  • @app.trace()
5)路由+请求方法 +函数的映射
  • 路径 :是 /
  • 操作 :是 get
  • 函数 :是位于「装饰器」下方的函数(位于 @app.get("/") 下方)
@app.get("/")
def root():return {"message": "Hello World"}
6)返回响应
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def root():return {"message": "Hello World"}  # 返回响应

你还可以返回一个 dictlist,像 strint 一样的单个值,等等。你还可以返回 Pydantic 模型。还有许多其他将会自动转换为 JSON 的对象和模型(包括 ORM 对象等)。

四、路由参数

你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

@app.get("/items/{item_id}")
def read_item(item_id):return {"item_id": item_id}

路径参数 item_id 的值将作为参数 item_id 传递给你的函数。所以,如果你运行示例并访问 http://127.0.0.1:8000/items/foo,将会看到如下响应:

{"item_id":"foo"}

1、定义参数的类型

你可以使用标准的 Python 类型标注为函数中的路径参数声明类型。

@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}

在这个例子中,item_id 被声明为 int 类型。FastAPI 通过上面的类型声明提供了对请求的自动"解析"。

同时还提供数据校验功能:

如果你通过浏览器访问 http://127.0.0.1:8000/items/foo,你会看到一个清晰可读的 HTTP 错误:

{"detail": [{"loc": ["path","item_id"],"msg": "value is not a valid integer","type": "type_error.integer"}]
}

因为路径参数 item_id 传入的值为 "foo",它不是一个 int

你可以使用同样的类型声明来声明 strfloatbool 以及许多其他的复合数据类型。

2、路由匹配的顺序

由于路由匹配操作是按顺序依次运行的,你需要确保路径 /users/me 声明在路径 /users/{user_id}之前:

@app.get("/users/me")
def read_user_me():return {"user_id": "the current user"}@app.get("/users/{user_id}")
def read_user(user_id: str):return {"user_id": user_id}

否则,/users/{user_id} 的路径还将与 /users/me 相匹配,"认为"自己正在接收一个值为 "me"user_id 参数。

3、预设值参数

如果你有一个接收路径参数的路径操作,但你希望预先设定可能的有效参数值,则可以使用标准的 Python Enum 类型。

Python中的枚举数据类型:是指列出有穷集合中的所有元素,即一一列举的意思。在Python中,枚举可以视为是一种数据类型,当一个变量的取值只有几种有限的情况时,我们可以将其声明为枚举类型。例如表示周几的这一变量weekday,只有七种可能的取值,我们就可以将其声明为枚举类型。

from enum import Enum
class Weekday(Enum):monday = 1tuesday = 2wednesday = 3thirsday = 4friday = 5saturday = 6sunday = 7print(Weekday.wednesday)         # Weekday.wednesday  
print(type(Weekday.wednesday))   # <enum 'Weekday'>
print(Weekday.wednesday.name)    # wednesday
print(Weekday.wednesday.value)   # 3
from enum import Enum
from fastapi import FastAPIclass ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"app = FastAPI()@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):if model_name is ModelName.alexnet:return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "lenet":return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}

相关文章:

【Python】FastAPI入门

文章目录 第一节&#xff1a;FastAPI入门一、FastAPI框架介绍什么是ASGI服务&#xff08;WSGI&#xff09;1、补充Web开发1&#xff09;Web前端开发2&#xff09;Web后端开发 二、FastAPI安装1、安装Python虚拟环境2、安装FastAPI 三、第一个FastAPI案例1、访问接口和文档2、接…...

JavaScript系列(32)-- WebAssembly集成详解

JavaScript WebAssembly集成详解 &#x1f680; 今天&#xff0c;让我们深入了解JavaScript与WebAssembly的集成&#xff0c;这是一项能够显著提升Web应用性能的关键技术。 WebAssembly基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;WebAssembly&#xff08;简称W…...

wps数据分析000002

目录 一、快速定位技巧 二、快速选中技巧 全选 选中部分区域 选中部分区域&#xff08;升级版&#xff09; 三、快速移动技巧 四、快速录入技巧 五、总结 一、快速定位技巧 ctrl→&#xff08;上下左右&#xff09;快速定位光标对准单元格的上下部分双击名称单元格中…...

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得&#xff0c;大家都提到一个很“神秘”的服务&#xff1a;它基于 O1 Pro 模型&#xff0c;能够在对话里一直保持相对高水平的理解和回复&#xff0c;不会突然变得“降智”。同时&#xff0c;整体使用还做了免折腾的网络设置——简单一点…...

前端:前端开发任务分解 / 开发清单

一、背景 前端开发过程中&#xff0c;好多任务同时开发&#xff0c;或者一个大的任务分解为若干个子任务进行开发&#xff0c;分解出去的很多内容容易记不清楚 / 不易过程管理&#xff0c;所以记录表格如下&#xff0c;方便开发同事&#xff0c;也辅助掌握整体开发情况。 二、…...

【Django自学】Django入门:如何使用django开发一个web项目(非常详细)

测试机器&#xff1a;windows11 x64 python版本&#xff1a;3.11 一、安装Django 安装步骤非常简单&#xff0c;使用pip安装就行 pip install django安装完成之后&#xff0c;python的 Scripts 文件夹下&#xff0c;会多一个 django-admin.exe (管理创建django项目的工具)。…...

面试经验分享-回忆版某小公司

说说你项目中数据仓库是怎么分层的&#xff0c;为什么要分层&#xff1f; 首先是ODS层&#xff0c;连接数据源和数据仓库&#xff0c;数据会进行简单的ETL操作&#xff0c;数据来源通常是业务数据库&#xff0c;用户日志文件或者来自消息队列的数据等 中间是核心的数据仓库层&a…...

WebSocket——推送方案选型

一、前言&#xff1a;为何需要服务端主动推送&#xff1f; 在现代应用中&#xff0c;很多功能都依赖于“消息推送”。比如&#xff1a; 小红点提醒&#xff1a;我们经常在手机应用里看到的一个小红点提示&#xff0c;表示有新的消息或任务需要我们关注。新消息提醒&#xff1…...

山石防火墙命令行配置示例

现网1台山石SG6000防火墙&#xff0c;配置都可以通过GUI实现。 但有一些配置在命令行下配置效率更高&#xff0c;比如在1个已有策略中添加1个host或端口。 下面的双引号可以不加 1 创建服务 1.1 单个端口 service "tcp-901"tcp dst-port 901 1.2 端口范围 servi…...

LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145185794 Scaling Laws (缩放法则) 是大模型领域中&#xff0c;用于描述 模型性能(Loss) 与 模型规模N、数据量D、计算资源C 之间关系的经验规律…...

Leetcode 983. 最低票价 动态规划

原题链接&#xff1a;Leetcode 983. 最低票价 class Solution { public:int mincostTickets(vector<int>& days, vector<int>& costs) {int n days.size();int last days[n - 1];int dp[last 1];map<int, int> mp;for (auto x : days)mp[x] 1;dp…...

Kafka——两种集群搭建详解 k8s

1、简介 Kafka是一个能够支持高并发以及流式消息处理的消息中间件&#xff0c;并且Kafka天生就是支持集群的&#xff0c;今天就主要来介绍一下如何搭建Kafka集群。 Kafka目前支持使用Zookeeper模式搭建集群以及KRaft模式&#xff08;即无Zookeeper&#xff09;模式这两种模式搭…...

springboot使用websocket

文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略&#xff0c;附上官方文档&#xff0c;spring5和spring6的官方文档内容大致是一样的&#xff1a; https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...

Redis的安装和配置、基本命令

一、实验目的 本实验旨在帮助学生熟悉Redis的安装、配置和基本使用&#xff0c;包括启动Redis服务、使用命令行客户端进行操作、配置Redis、进行多数据库操作以及掌握键值相关和服务器相关的命令。 二、实验环境准备 1. JAVA环境准备&#xff1a;确保Java Development Kit …...

Rnote:Star 8.6k,github上的宝藏项目,手绘与手写画图笔记,用它画图做笔记超丝滑,值得尝试!

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 Rnote是一款开源的基于矢量的绘图应用&#xff0c;专为学生、教师以及绘图板用户设计。它支持草图绘制、手写笔记以及对文档和图片进行注释。Rnote提供…...

python如何解析word文件格式(.docx)

python如何解析word文件格式&#xff08;.docx&#xff09; .docx文件遵从开源的“Office Open XML标准”&#xff0c;这意味着我们能用python的文本操作对它进行操作&#xff08;实际上PPT和Excel也是&#xff09;。而且这并不是重复造轮子&#xff0c;因为市面上操作.docx的…...

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了&#xff0c;欢迎广大GISer朋友关注&#xff0c;一起探索GIS奥秘&#xff0c;分享GIS价值&#xff01; 本专栏以实战案例的形式&#xff0c;深入浅出地介绍了GRASS GIS的基本使用方法&#xff0c;用一个个实例讲…...

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…...

零基础构建最简单的 Tauri2.0 桌面项目 Star 88.4k!!!

目录 预安装环境 安装nodejs windows下安装 linux下安装 nodejs常遇问题 安装C环境 介绍 下载 安装 安装Rust语言 Tauri官网 安装 vscode 安装 rust 插件 安装 Tauri 插件 运行成果 预安装环境 安装nodejs windows下安装 NodeJs_安装及下载_哔哩哔哩_bilibi…...

智能科技与共情能力加持,哈曼重新定义驾乘体验

2025年1月6日&#xff0c;拉斯维加斯&#xff0c;2025年国际消费电子展——想象一下&#xff0c;当您步入一辆汽车&#xff0c;它不仅能响应您的指令&#xff0c;更能理解您的需求、适应您的偏好&#xff0c;并为您创造一个独特且专属的交互环境。作为汽车科技领域的知名企业和…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...