Java出身的程序员也许知道利用Spring Mvc框架开发一个web应用多麻烦,当然Python也提供一些轻量级的web框架,如Django、Flask。我曾经就使用过Flask开发过mock平台和小工具平台,但是Python栈的web框架缺点就是并发性相对比较差,如果请求量级上来了,服务性能就会差一些,适合做一些对性能要求不是太高的“玩意”。
当然今天的主角不是上述提到的,而是FastApi,一个用于构建 API 的现代、快速(高性能)的web框架。下面就给大家做一个入门ABC,讲解一下其特点以及如何使用。
特点
- 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
- 高效编码:提高功能开发速度约 200% 至 300%。
- 更少bug:减少约 40% 的人为(开发者)导致错误。
- 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
- 简单:设计的易于使用和学习,阅读文档的时间更短。
- 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。
- 健壮:生产可用级别的代码。还有自动生成的交互式文档。
话不多说,先上个小菜开开胃。
pip install fastapi
安装uvicorn来作为服务器:
pip install uvicorn[standard]
第一行代码
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
INFO:Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
该行显示了你的应用在本机所提供服务的 URL 地址。
交互式 API 文档
跳转到 http://127.0.0.1:8000/docs。你将会看到自动生成的交互式 API 文档。
开发步骤
步骤 1:导入 FastAPI
from fastapi import FastAPI
app = FastAPI()
FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
技术细节
FastAPI 是直接从 Starlette 继承的类。
你可以通过 FastAPI 使用所有的 Starlette 的功能。
步骤 2:创建一个 FastAPI「实例」
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
这里的变量 app 会是 FastAPI 类的一个「实例」。
这个实例将是创建你所有 API 的主要交互对象。
这个 app 同样在如下命令中被 uvicorn 所引用:
如果你像下面这样创建应用:
from fastapi import FastAPI
my_awesome_api = FastAPI()
@my_awesome_api.get("/")
async def root():
return {"message": "Hello World"}
将代码放入 main.py 文件中,然后你可以像下面这样运行 uvicorn:
步骤 3:创建一个路径操作
路径
这里的「路径」指的是 URL 中从第一个 / 起的后半部分。
所以,在一个这样的 URL 中:
https://example.com/items/foo
...路径是:/items/foo
「路径」也通常被称为「端点」或「路由」。
开发 API 时,「路径」是用来分离「关注点」和「资源」的主要手段。
操作
这里的「操作」指的是一种 HTTP「方法」。
下列之一:
- POST
- GET
- PUT
- DELETE
...以及更少见的几种:
- OPTIONS
- HEAD
- PATCH
- TRACE
在 HTTP 协议中,你可以使用以上的其中一种(或多种)「方法」与每个路径进行通信。
在开发 API 时,你通常使用特定的 HTTP 方法去执行特定的行为。
通常使用:
- POST:创建数据。
- GET:读取数据。
- PUT:更新数据。
- DELETE:删除数据。
因此,在 OpenAPI 中,每一个 HTTP 方法都被称为「操作」。
我们也打算称呼它们为「操作」。
定义一个路径操作装饰器
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.get("/") 告诉 FastAPI 在它下方的函数负责处理如下访问请求:
- 请求路径为 /
- 使用 get 操作
你也可以使用其他的操作:
- @app.post()
- @app.put()
- @app.delete()
以及更少见的:
- @app.options()
- @app.head()
- @app.patch()
- @app.trace()
步骤 4:定义路径操作函数
这是我们的「路径操作函数」:
- 路径:是 /。
- 操作:是 get。
- 函数:是位于「装饰器」下方的函数(位于 @app.get("/") 下方)。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
这是一个 Python 函数。
每当 FastAPI 接收一个使用 GET 方法访问 URL「/」的请求时这个函数会被调用。
在这个例子中,它是一个 async 函数。
你也可以将其定义为常规函数而不使用 async def:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
步骤 5:返回内容
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
你可以返回一个 dict、list,也可以像 str、int 一样的单个值,等等。