使用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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
python列表操作实例
Jan 14 Python
Python itertools模块详解
May 09 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
如何高效使用Python字典的方法详解
Aug 31 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
python函数修饰符@的使用方法解析
Sep 02 Python
解析python中的jsonpath 提取器
Jan 18 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日历制作代码分享
2014/01/20 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
js实现开关灯效果
2020/03/30 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python正则表达式面试题解答
2020/04/28 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
Python中super函数用法实例分析
2019/03/18 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
python 日志 logging模块详细解析
2020/03/31 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
Python字典dict常用方法函数实例
2020/11/09 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
超市开业庆典策划方案
2014/05/14 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python