使用Python FastAPI构建Web服务的实现


Posted in Python onJune 08, 2020

FastAPI 是一个使用 Python 编写的 Web 框架,还应用了 Python asyncio 库中最新的优化。本文将会介绍如何搭建基于容器的开发环境,还会展示如何使用 FastAPI 实现一个小型 Web 服务。

起步

我们将使用 Fedora 作为基础镜像来搭建开发环境,并使用 Dockerfile 为镜像注入 FastAPI、Uvicorn 和 aiofiles 这几个包。

FROM fedora:32
RUN dnf install -y python-pip \
  && dnf clean all \
  && pip install fastapi uvicorn aiofiles
WORKDIR /srv
CMD ["uvicorn", "main:app", "--reload"]

在工作目录下保存 Dockerfile 之后,执行 podman 命令构建容器镜像。

$ podman build -t fastapi .
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB

下面我们可以开始创建一个简单的 FastAPI 应用程序,并通过容器镜像运行。

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/")
async def root():
  return {"message": "Hello Fedora Magazine!"}

将上面的代码保存到 main.py 文件中,然后执行以下命令开始运行:

$ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi
$ curl http://127.0.0.1:8000
{"message":"Hello Fedora Magazine!"

这样,一个基于 FastAPI 的 Web 服务就跑起来了。由于指定了 --reload 参数,一旦 main.py 文件发生了改变,整个应用都会自动重新加载。你可以尝试将返回信息 "Hello Fedora Magazine!" 修改为其它内容,然后观察效果。

可以使用以下命令停止应用程序:

$ podman stop fastapi

构建一个小型 Web 服务

接下来我们会构建一个需要 I/O 操作的应用程序,通过这个应用程序,我们可以看到 FastAPI 自身的特点,以及它在性能上有什么优势(可以在这里参考 FastAPI 和其它 Python Web 框架的对比)。为简单起见,我们直接使用 dnf history 命令的输出来作为这个应用程序使用的数据。

首先将 dnf history 命令的输出保存到文件。

$ dnf history | tail --lines=+3 > history.txt

在上面的命令中,我们使用 tail 去除了 dnf history 输出内容中无用的表头信息。剩余的每一条 dnf 事务都包括了以下信息:

  • id:事务编号(每次运行一条新事务时该编号都会递增)
  • command:事务中运行的 dnf 命令
  • date:执行事务的日期和时间

然后修改 main.py 文件将相关的数据结构添加进去。

from fastapi import FastAPI
from pydantic import BaseModel
 
app = FastAPI()
 
class DnfTransaction(BaseModel):
  id: int
  command: str
  date: str

FastAPI 自带的 pydantic 库让你可以轻松定义一个数据类,其中的类型注释对数据的验证也提供了方便。

再增加一个函数,用于从 history.txt 文件中读取数据。

import aiofiles
 
from fastapi import FastAPI
from pydantic import BaseModel
 
app = FastAPI()
 
class DnfTransaction(BaseModel):
  id: int
  command: str
  date: str
 
 
async def read_history():
  transactions = []
  async with aiofiles.open("history.txt") as f:
    async for line in f:
      transactions.append(DnfTransaction(
        id=line.split("|")[0].strip(" "),
        command=line.split("|")[1].strip(" "),
        date=line.split("|")[2].strip(" ")))
  return transactions

这个函数中使用了 aiofiles 库,这个库提供了一个异步 API 来处理 Python 中的文件,因此打开文件或读取文件的时候不会阻塞其它对服务器的请求。

最后,修改 root 函数,让它返回事务列表中的数据。

@app.get("/")
async def read_root():
  return await read_history()

执行以下命令就可以看到应用程序的输出内容了。

$ curl http://127.0.0.1:8000 | python -m json.tool
[
{
"id": 103,
"command": "update",
"date": "2020-05-25 08:35"
},
{
"id": 102,
"command": "update",
"date": "2020-05-23 15:46"
},
{
"id": 101,
"command": "update",
"date": "2020-05-22 11:32"
},
....
]

总结

FastAPI 提供了一种使用 asyncio 构建 Web 服务的简单方法,因此它在 Python Web 框架的生态中日趋流行。要了解 FastAPI 的更多信息,欢迎查阅 FastAPI 文档。

本文中的代码可以在 GitHub 上找到。

到此这篇关于使用Python FastAPI构建Web服务的实现的文章就介绍到这了,更多相关Python FastAPI构建Web服务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Python 相关文章推荐
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
Flask之flask-script模块使用
Jul 26 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
python实现蒙特卡罗方法教程
Jan 28 Python
python list多级排序知识点总结
Oct 23 Python
python pygame实现挡板弹球游戏
Nov 25 Python
python使用gdal对shp读取,新建和更新的实例
Mar 10 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
利用python进行文件操作
Dec 04 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 #Python
给ubuntu18安装python3.7的详细教程
Jun 08 #Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 #Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 #Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 #Python
python如何编写win程序
Jun 08 #Python
如何写python的配置文件
Jun 07 #Python
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
Python高级用法总结
2018/05/26 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python3转换code128条形码的方法
2019/04/17 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python speech模块的使用方法
2020/09/09 Python
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
求职简历中个人的自我评价
2013/12/01 职场文书
好军嫂事迹材料
2014/01/15 职场文书
影子教师研修方案
2014/06/14 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
电力安全学习心得体会
2016/01/18 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python