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

智能推荐

用java Swing做的小游戏"像素鸟"_java swing小游戏-程序员宅基地

文章浏览阅读4.4k次,点赞10次,收藏38次。最终效果 整个项目都是基于swing实现的。窗是口将图片加载到JPanel面板,然后将面板添加到到JFrame窗口实现显示。这个类是选择几只像素鸟的类,也是main函数里执行的方法,代码有详细的注释,这里就不废话了public class select extends JPanel { /** * */ private static final long serialVersio..._java swing小游戏

三分钟教你读懂支票是什么_支票的原理是什么-程序员宅基地

文章浏览阅读8.7k次。三分钟教你读懂支票是什么支票1、支票的概念及特点支票:出票人签发的,委托办理支票存款业务的银行或其他金融机构在见票时无条件支付确定金额给收款人或持票人的票据。支票必填项:支票字样、确定的金额、出票日期、无条件支付委托、付款人名称、出票人签章。支票选填项:付款地、出票地。支票结算特点:(1)简便,手续_支票的原理是什么

山东工商学院 计算机科学与技术,实验中心-山东工商学院计算机科学与技术学院...-程序员宅基地

文章浏览阅读148次。计算机教学实验中心成立于1999年,隶属计算机科学与技术学院。实验中心现有软件、电子、网络、通信、大学生科技创新、AR技术研究所等41间实验室,实验面积5600平方米,固定资产3500万元,教(职)工26人。实验中心以先进精良的设备条件、整洁舒适的教学环境、科学严谨的管理方式为计算机科学与技术学院、信息与电子工程学院、管理科学与工程学院等学院的实验教学、课程设计、毕业设计等实践环节和全院计算机公共..._计算机科学与技术实验教学中心 山东

CUDA ERROR: device-side assert triggered at 问题及解决思路-程序员宅基地

文章浏览阅读10w+次,点赞45次,收藏82次。cuda errorRuntimeError: cuda runtime error (59) : device-side assert triggered at ...我之前还以为是因为GPU抽风了引发的BUG,所以第一次没有在意,直接又重新开始运行了一次,但是第二次就发现程序在同样的地方断掉了,这也就想起来我以前看到的一个博客,里面有句话的大概意思是这样的:每次都在同样的地方出错的..._cuda error: device-side assert triggered

HDOJ1556 树状数组简单应用_hdoj 树状数组基础-程序员宅基地

文章浏览阅读251次。Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23142 Accepted Submission(s): 11237Problem DescriptionN个气球排成一排,_hdoj 树状数组基础

浅析HTML_解析html-程序员宅基地

文章浏览阅读430次。HTML面试题整理以及一些自我理解_解析html

随便推点

chatgpt赋能python:Python如何分离CSV的列_python的csv拆列-程序员宅基地

文章浏览阅读270次。CSV文件是一种以逗号或其他分隔符分隔的文件格式,用于存储表格数据。它可以用任何文本编辑器打开,并且非常适合在电子表格程序(例如Microsoft Excel或Google Sheets)中打开和处理。CSV文件通常由一组记录组成,每条记录包含一个或多个字段。字段之间使用逗号或其他指定的分隔符分隔。CSV文件中的第一行通常包含列标题,这些标题描述了每个字段的含义。Jack,19,UK本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。_python的csv拆列

MYSQL8安全之SSL认证_mysql ssl-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏17次。MYSQL8安全之SSL认证_mysql ssl

Java Swing 如何使用JTree(1)_swing 如何初始化一个jtree-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏6次。Java Swing 如何使用JTree_swing 如何初始化一个jtree

Go 语言到底适合干什么?_对java开发者来说 go 能做什么-程序员宅基地

文章浏览阅读115次。Go 语言对于构建微服务和 API 很有优势,因为它的代码结构简单,易于维护,同时具有高效和高并发特性。由于云计算中的系统通常是分布式的,Go 语言的并发编程模型非常适合用于处理云计算中的任务。由于 Go 语言具有高效和高性能的特性,因此它非常适合用于构建 Web 应用程序。Go 语言原生支持高效的并发编程,因此非常适合用于构建网络应用程序和分布式系统。Go 语言具有高效的执行性能和并发处理能力,因此很适合用于处理大量数据。Go 语言的语言特性、安全性和执行效率都非常适合用于系统编程领域。_对java开发者来说 go 能做什么

【虚拟仿真】Unity3D中拆分模型教程(多种类型模型拆分)_unity怎么拆分模型-程序员宅基地

文章浏览阅读1.4w次,点赞63次,收藏160次。推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。一、前言今天有小伙伴在我这篇文章【虚拟仿真】Unity3D对物体进行拆分实现下面问我如何一秒一拆:虽然我已经给出了思路,但是离实现还是有点思路,正好我对于我这篇文章也是不满意,就解答一下小伙伴的疑惑,然后再将文章内容进行升级。原文章:【虚拟仿真】Unity3D对物体进行拆分实._unity怎么拆分模型

ChatGLM2本地部署的实战方案-程序员宅基地

文章浏览阅读10w+次,点赞55次,收藏74次。本文主要介绍了ChatGLM2本地部署应用的实战方案,希望对学习大语言模型的同学们有所帮助。文章目录1. 介绍2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库3. 下载权重文件4. 运行ChatGLM2 4.1 方式一 4.2 方式二_chatglm2