FastAPI Web开发入门、进阶与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 FastAPI框架概述

FastAPI框架不仅具有Flask或Django的Web核心功能,还兼具异步特性,可以同时兼容同步和异步这两种模式的运行。也就是说,用户可以使用同步的方式编写API,也可以使用异步的方式来编写API。不仅如此,它对于一些插件的自定义扩展相当简单,插件间可以相互独立。用户可以根据实际业务需求来定义不同的组件或插件来扩展并集成到FastAPI中。

1.1.1 FastAPI与其他Web框架

关于框架的选择,每个人都有自己的偏好和考虑因素。选择一个合适的框架,应考虑多方面因素,包括但不限于开发效率、团队技术栈、公司自身业务场景、框架自身的可维护性、社区支持和文档等。不同的框架适用于不同的场景和应用,而选择框架的最终目的是提高开发效率,实现业务需求。框架对于应用开发本身只是一个辅助实现业务逻辑的工具。早期,在FastAPI框架还没开发出来之前,类似Bottle、Flask、Django、Sanic等框架的使用非常广泛,现在FastAPI框架越来越流行。尽管每种框架各有优缺点,但都可以用来实现业务需求并提高开发效率。因此,选择哪一种框架,应该根据实际需求和个人喜好来确定,而不是追求某种框架的“完美性”。

众多框架中,Bottle是一个比较小众的框架,是众多Web框架中最简单、快速和轻量级的WSGI微型Web框架,整个框架只有一个文件模块。框架本身除了Python标准库之外,不产生其他第三方的依赖项。虽然Bottle比较小众,但是编写小的应用API它也是可以胜任的。框架本身没有完美之说,Bottle的轻量、不依赖第三方这些特性,也让它自身存在一定的局限,比如插件生态比较少,很多功能需要自己实现扩展,比如参数校验、Session的支持等。

Flask也是一个轻量级的Web应用框架,是基于Werkzeug WSGI工具箱和Jinja2模板引擎而开发出来的。Flask自己也宣称是一个Micro Framework的框架。Flask之所以比Bottle更加受欢迎,是因为它自身的设计非常好,对于一些功能插件也保留了弹性扩展,而且它是持续更新维护的。从这一点上,就足以让更多的人愿意使用它。Flask框架的插件生态也非常好,有非常多的可用第三方插件,开箱即用。

Django是一个大而全的框架,是一个完整的Web开发框架。对于小业务场景来说,使用Django框架会过于笨重,部分模块也无法进行定制。但是Django仍然是Python Web框架中非常流行的框架之一,国内外的一些大企业都是其用户,如国内腾讯的蓝鲸智云PaaS平台,国外则有图片分享社交应用Instagram、Pinterest等。如果需要构建健壮的全栈式网站,那么Django框架是比较好的选择。

Sanic和FastAPI框架一样,是一个异步框架。它是首批基于asyncio的极端快速Python框架之一。它允许使用Python 3.5中添加的async/await语法,这使得用户的代码不阻塞,速度更快。它不仅是一个框架,也是一个服务器,可以随时为用户编写的Web应用程序提供部署服务。对于Sanic框架,官网有详细介绍,这里不过多叙述。

FastAPI框架则集众框架之所长。对于FastAPI框架的详细说明,读者可以自行查阅,网址为https://FastAPI.tiangolo.com/alternatives/。

1.1.2 FastAPI的特性

FastAPI之所以能被多数人认可并使用,主要原因与它所具备的一些特性有着极大的关系。FastAPI为了构建快速的API而生。FastAPI的特性主要有:

❑是一个支持ASGI(Asynchronous Server Gateway Interface)协议的Web应用框架,也就是说,它同时兼容ASGI和WSGI的应用。

❑天然支持异步协程处理,能快速处理更多的HTTP请求。

❑使用了Pydantic类型提示的特性,可以更加高效、快速地进行接口数据类型校验及模型响应等处理。

❑基于Pydantic模型,它还可以自动对响应数据进行格式化和序列化处理。

❑提供依赖注入系统的实现,它可以让用户更高效地进行代码复用。

❑它支持WebSocket、GraphQL等。

❑支持异步后台任务,可以方便地对耗时的任务进行异步处理。

❑支持服务进程启动和关闭事件回调监听,可以方便地进行一些插件的扩展初始化。

❑支持跨域请求CORS、压缩Gzip请求、静态文件、流式响应。

❑支持自定义相关中间件来处理请求及响应。

❑支持开箱即用OpenAPI(以前被称为Swagger)和JSON Schema,可以自动生成交互式文档。

❑使用uvloop模块,让原生标准的asyncio内置的事件循环更快。

ASGI是异步服务器网关接口,和WSGI一样,都是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。但是ASGI是WSGI的一种扩展的实现,并且提供异步特性和WebSocket等的支持。同时ASGI也是兼容WSGI的,在某种程度上可以理解为ASGI是WSGI的超集,所以ASGI可以支持同步和异步同时运行,内部可以直接通过一个转换装饰器进行相互切换。

首先从快速特性来说,基于异步协程方式的Web框架目前是多数开发者寻求的一个关键点,在多核CPU下如何更加高效地提高CPU使用效率也是当下众多异步Web框架的关注点,而FastAPI融合原生asyncio异步协程的特性刚好迎合了这个契机。

FastAPI基于Starlette和Pydantic做了很多封装,简化了一些编码工作。如相关的参数类型提示、参数校验、直接输出模型响应报文等,都为开发者提供了很多便利,让程序员可以更加顺畅、快速地进行编码工作。

另外,FastAPI还配备了OpenAPI规范(OAS),它自动生成了OpenAPI模式。基于OpenAPI,用户可以直接、快速地对API文档进行查看和调试,可以让用户使用相同的代码来定义序列化和相关数据验证,这种所见即所得的开箱体验是非常好的。

OpenAPI规范(OAS)是一个定义标准的与具体编程语言无关的RESTful API的规范。

目前在国内,越来越多的后端开发者从使用Flask框架慢慢转移到了FastAPI框架。本书会从FastAPI框架的基础知识到具体项目的实战内容进行叙述。如果读者有Flask框架的使用体验,过渡到FastAPI框架是轻而易举的。如果读者没有任何的Web框架开发经验,那么学习本书可以帮助读者使用FastAPI进行实际项目开发。