FastAPI:重燃Python Web开发的火花(一)_python 开发web 困难-程序员宅基地

技术标签: python  fastapi  前端  

前言

Python在Web开发中面临着哪些挑战,又该如何克服这些挑战呢?在本文中,我们将探讨FastAPI框架如何帮助我们解决这些问题,重燃Python Web开发的火花。

Python Web开发的短板

  1. 性能挑战:相较于C/C++,Java等语言,Python的性能表现较弱,这使得它在处理大型、高并发的Web应用方面可能并非首选。
  2. 多线程支持不佳:由于Python的全局解释器锁(GIL)的存在,使得Python在多线程处理上并不理想。
  3. 运行时错误:Python是动态类型语言,很多错误只有在运行时才能被发现,这对Web开发来说是个隐患。
  4. 缺乏成熟的异步库:尽管Python 3已经引入了原生的异步I/O支持,但与Node.js等相比,其成熟的异步库仍然较少。
  5. 部署过程较为繁琐:相对于PHP、Java等语言,Python的Web应用部署过程更加复杂,这无疑增加了开发的难度。

以上都是Python Web开发的一些短板,但是随着技术的发展,如FastAPI框架的出现,可以有效的解决Python Web开发中的一些问题。

1. FastAPI简介

FastAPI 是一个现代、快速(高性能)的 web 框架,用于构建 APIs,基于 Python 3.6 类型提示以及 Starlette 和 Pydantic 的强大的性能。FastAPI 对 Python Web 开发的短板进行了以下改进:

  1. 高性能:FastAPI 是一个高性能框架,只比 NodeJS 和 Go 稍慢,这在很大程度上解决了 Python 在 Web 开发中的性能问题。
  2. 易于编写异步代码:FastAPI 完全支持异步编程,并且可以与 Starlette(一个轻量级 ASGI 框架/工具集)一起使用,这使得在 Python 中编写高性能的异步代码变得更加容易。
  3. 减少运行时错误:FastAPI 利用 Python 3.6+ 的类型提示,可以通过编辑器和工具的支持,在代码开发阶段就检测出大部分错误,而不必等到运行时。
  4. 自动化 API 文档:FastAPI 自动为你的 API 生成交互式 API 文档,这在开发和调试过程中非常有用。
  5. 易于部署:FastAPI 可以轻松与 Docker 配合使用,使得部署变得非常简单。

因此,FastAPI 在很大程度上改善了 Python Web 开发的一些短板。

2. 环境准备

2.1 安装FastAPI

安装FastAPI相当简单,只需要使用Python的包管理器pip。在命令行或终端中,输入以下命令:

pip install fastapi

这个命令会下载并安装FastAPI。

2.2 安装Uvicorn

FastAPI是异步的,所以还需要一个ASGI服务器,Uvicorn是目前最快的ASGI服务器之一,我们可以安装它:

pip install uvicorn

3. 构建一个基础的FastAPI应用程序

3.1 编写程序

在main.py文件中输入以下代码:

from fastapi import FastAPI

app = FastAPI(title='FastAPI接口文档', description='Fastapi接口文档', version="2.5.0", )

@app.get("/api/login", summary='登录', description='实现登录功能', tags=['登录'])
def login():
    return {"Hello": "World"}

@app.get("/api/login_out", summary='登出', description='实现登出功能', tags=['登出'])
def login_out():
    return {"Hello": "World"}

@app.get("/three/{params}", summary='测试', description='实现测试的功能', tags=['测试'])
def test(params: str = None):
    return {"Hello": params}

了解FastAPI程序结构:

第一步,导入FastAPI

from fastapi import FastAPI

第二步,创建一个app实例

app = FastAPI()

第三步,编写一个 路径操作装饰器

@app.get("/")

3.2 测试无参数情况

3.3 测试有参数情况

如图可见我们输入的参数,被返回了

4. FastAPI 请求参数

4.1 GET请求参数

GET方式的参数有两种,一种是路径参数,一种是查询参数。

路径参数: 在FastAPI中,路径参数是指在URL路径中的一部分,通常用于指定资源的唯一标识符。可以通过在路径操作函数的参数中定义同名的变量来声明路径参数。

from fastapi import FastAPI

app = FastAPI()

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

在这个例子中,item_id就是一个路径参数。当你访问如/items/5这样的URL时,item_id的值就会被设置为5,FastAPI会自动识别并解析路径参数,无需进行任何额外的配置。此外,FastAPI还支持路径参数的类型注解,可以通过类型注解来指定路径参数的类型,FastAPI会自动进行类型检查和转换。

查询参数: 在FastAPI中,查询参数是指URL中跟在问号后面的键值对,通常用于提供非必要的额外信息。可以通过在路径操作函数的参数中定义默认值来声明查询参数。

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

在这个例子中,skip和limit就是查询参数,我们指定了skip和limit的类型为int,所以如果访问如/items/?skip=foo&limit=10这样的URL,FastAPI会返回一个明确的错误,告诉你skip的值必须是整数,当你访问如/items/?skip=20&limit=10这样的URL时,skip的值就会被设置为20,limit的值就会被设置为10,FastAPI会自动识别并解析查询参数,无需进行任何额外的配置。

4.2 请求体参数

不使用 Pydantic的栗子:

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.post("/items")
async def read_item(item: dict):
    return {"item": item}

用 postman 发起请求,选 JSON 格式,因为接收的是 dict,所以 FastAPI 会自动将 JSON 字符串转换为 dict

使用 Pydantic的栗子:

from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    age: Optional[int] = None
    gender: str
    hobby: str = None

@app.post("/items/")
async def create_item(item: Item):
    return item

参数指定为 Pydantic 模型后,FastAPI将请求体识别为 JSON 字符串,验证数据,如果验证失败,会返回一个清晰的错误,准确指出错误数据的位置和信息,item 会接收到完整的请求体数据,拥有所有属性及其类型,IDE 也会给予对应的智能提示

5 运行应用

运行命令: uvicorn main:app --reload

注意:运行命令app前面那个是文件位置,要以实际的文件名为准

uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

6 FastAPI API文档

FastAPI文档形式:交互式API文档、备用API文档

6.1 交互式API文档

在浏览器中请求 http://127.0.0.1:8000/docs ,显示交互式API文档, 自动交互式 API 文档(由 Swagger UI 提供,Swagger UI是一个非常流行的API文档生成工具,它可以生成交互式的、易于理解的API文档),如图:

此外,还可以通过在FastAPI应用对象上设置.title, .description 和 .version 属性来配置API的整体描述信息。这些信息将会显示在自动生成的API文档页面的顶部。

此时还可以单击某个具体的API,然后单击Try it out,然后填写参数,并单击Execute按钮来执行。

6.2 备用API文档

在浏览器中请求 http://127.0.0.1:8000/redoc ,显示备用API文档,备用的自动交互式文档(由 ReDoc 提供),如图:

总结:本篇文章介绍了FastAPI的基础部分,总的来说,FastAPI是一个功能强大、易用、高效的Web开发框架,无论你是Python新手,还是有经验的开发者,FastAPI都能帮助你更高效、更便捷地构建出高性能的Web应用。

参考:

1.FastAPI官网 fastapi.tiangolo.com/zh/

最后

FastAPI作为Python Web开发新的利器,已经吸引了大量的开发者的关注。让我们一起探索和学习,用FastAPI构建出更好的Web应用,重燃Python Web开发的火花!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_68789096/article/details/134297296

智能推荐

湖南大学计算机专硕非全日制,非全日制研究生,到底“行不行”?-程序员宅基地

文章浏览阅读1.9k次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼虽然,对于非全日制研究生,今年国家五部门已通知:非全日制研究生在学历学位证书、就业等方面要与全日制平等,但仍有不少学生反映,一些企业在招聘问答环节中直接明确回复,“不招收非全日制研究生”,有的HR更是直接表明,全日制和非全日制研究生的区别大了去了,“非全日制=本科生”。“非全”研究生:仿佛读了个“假硕士”作为西北某大学2017级“非全”硕士研究生,小曹在..._湖南大学非全计算机

POJ 2987 最大权闭合图_最大权封闭图-程序员宅基地

文章浏览阅读3k次。请参考胡伯涛的论文《最小割模型在信息学竞赛中的应用》闭合图的概念就很好引出了。在一个图中,我们选取一些点构成集合,记为V,且集合中的出边(即集合中的点的向外连出的弧),所指向的终点(弧头)也在V中,则我们称V为闭合图。最大权闭合图即在所有闭合图中,集合中点的权值之和最大的V,我们称V为最大权闭合图。首先引入结论,最小割所产生的两个集合中,其源点S所在集合(除去S)为最大权闭_最大权封闭图

大道至简——RISC-V架构之魂(上)_rsiv-c架构-程序员宅基地

文章浏览阅读1w次。本文为《RISC-V CPU设计》专栏和《RISC-V嵌入式软件开发》专栏系列文章之一。注:本文节选自“硅农亚历山大”所著国内第一本系统介绍CPU与RISC-V设计的中文书籍《手把手教你设计CPU:RISC-V处理器篇》(预计将于2018年3~4月上市)。“大道至简——RISC-V架构之魂”——分成上中下三篇,本文是上篇。关注文末公众号后可查询上中下三篇的内容。注意:本文中将会多次出现“..._rsiv-c架构

超越RFC3550 - RTP/RTCP协议族分析_什么情况下使用rtp/avpf-程序员宅基地

文章浏览阅读651次。一 前言RF3550定义实时传输协议RTP和它的控制协议RTCP。RTP协议是Internet上针对流媒体传输的基础协议,该协议详细说明在互联网上传输音视频的标准数据包格式。RTP本身只保证实时数据的传输,并不能提供可靠传输、流量控制和拥塞控制等服务质量保证,这需要RTCP协议提供这些服务。RTCP协议负责流媒体的传输质量保证,提供流量控制和拥塞控制等服务。在RTP会话期间,各参与者周期性_什么情况下使用rtp/avpf

c++遇到无法打开PDB文件该怎么解决?_已加载“c:\windows\system32\ucrtbased.dll”。无法查找或打开 pdb-程序员宅基地

文章浏览阅读4.6k次,点赞7次,收藏7次。“Project2.exe”(Win32): 已加载“D:\c++\Project2\Debug\Project2.exe”。已加载符号。“Project2.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。“Project2.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。无法查找或打开 PDB 文件。“Project2.exe”(Win32): 已加载“C:\Windo_已加载“c:\windows\system32\ucrtbased.dll”。无法查找或打开 pdb 文件。

idea没有push按钮-程序员宅基地

文章浏览阅读3.1k次,点赞6次,收藏11次。intellij idea不显示git push按钮的解决办法_idea没有push按钮

随便推点

Einsum: numpy,pytorch and Tensorflow_einsum 编译-程序员宅基地

文章浏览阅读263次。EINSUM IS ALL YOU NEED如果你和我一样,你会发现很难记住 PyTorch/TensorFlow 中用于计算点积、外积、转置和矩阵向量或矩阵矩阵乘法的所有不同函数的名称和签名。Einsum 表示法是表达所有这些以及对张量的复杂操作的一种优雅方式,本质上是使用特定于领域的语言。除了不必记住或定期查找特定库函数之外,这还有其他好处。一旦你理解并使用了 einsum,你将能够更快地编写更简洁高效的代码。当不使用 einsum 时,很容易引入不必要的张量整形和转置,以及可以省略的中间张量_einsum 编译

土木工程测量学复习知识点-程序员宅基地

文章浏览阅读273次,点赞3次,收藏9次。(3)我国的高程基准:称为“1985年国家高程基准”,即根据青岛验潮站1952年—1979年搜集的统计资料计算出的平均海水面作为高程零点,由此测得青岛水准原点高程为72.260米,称为1985年国家高程基准。c大地水准面所包围的球体可以代表整个地球形状d大地水准面是测量学的基准面,铅垂线是测量学的基准线。(1)工程控制网的建立(2)地形测绘(3)施工放样(4)设备安装(5)竣工测量(6)变形观测。(2)大地水准面:我们设想把平均静止的海水面向陆地延伸而形成的封闭曲面,称为大地水准面。

求分数序列前N项和_本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前n项之和。注意该序列从第2项-程序员宅基地

文章浏览阅读3.8k次,点赞13次,收藏23次。求分数序列前N项和分数 15作者 张彤彧单位 浙江大学本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。输入格式:输入在一行中给出一个正整数N。输出格式:在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。输入样例:20输出样例:32.66代码长度限制16 KB时间限制400 ms内存限制64 MB_本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前n项之和。注意该序列从第2项

《Python全栈开发:Python TCP/UDP》_tcp udp 开发python-程序员宅基地

文章浏览阅读1.8k次。一、基于TCP的套接字 tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 tcp服务端 ss = socket() #创建服务器套接字ss.bind() #把地址绑定到套接字ss.listen() #监听链接inf_loop: #服务器无限循环 cs = ss.accept() #接受客户端链接 comm_loop: #通讯循环 cs.recv()/cs.send() #对话(接收与发_tcp udp 开发python

清除博科光纤交换机所有配置信息_brocade 光纤交换机恢复出厂设置-程序员宅基地

文章浏览阅读1.3k次。清除博科光纤交换机所有配置信息_brocade 光纤交换机恢复出厂设置

matlab 二进制补码转十进制,MATLAB浮点数与定点二进制补码互转算法验证方案-程序员宅基地

文章浏览阅读1k次。最近本人一直在学习ZYNQSOC的使用,目的是应对科研需要,做出通用的算法验证平台。大概思想是:ZYNQPS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬件算法模块配置寄存器内容,同时可计算分析PL端算法实现性能指标。PL端的FPGA逻辑则负责算法的硬件实现,以探索高效并行硬件架构。为此本人后续会持续编写《利用ZYNQSOC快速打开算法验证通路》系列专..._matlab 补码转为十进制数