使用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接收多播数据的代码
Mar 01 Python
Python标准库之sqlite3使用实例
Nov 25 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
Python3.5集合及其常见运算实例详解
May 01 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 Python
用Python远程登陆服务器的步骤
Apr 16 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三层结构(上) 简单三层结构
2010/07/04 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
DIV菜单层实现代码
2010/11/19 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
团日活动策划书
2014/02/01 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
任命书范本大全
2014/06/06 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技