python:初识 Fastapi

简介

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJSGo 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger)和JSON Schema。

以上这些特性均为官方介绍的特性,咱也不知道,反正也用着,过程中实践这些关键特性

安装 FastAPI

第一个步骤是安装 FastAPI

1pip install fastapi

然后再并安装uvicorn来作为服务器:

1pip install uvicorn

当然你也可以直接安装所有(包括依赖包)

pip install fastapi[all]

第一个Fastapi实例

最简单的 FastAPI 文件可能像下面这样:

1from fastapi import FastAPI
2
3app = FastAPI()
4
5
6@app.get("/")
7async def root():
8    return {"message": "Hello World"}

命令行运行:

1lifeng@192 pythonFastapi % uvicorn main:app --reload
2INFO:     Will watch for changes in these directories: ['/Users/lifeng/python-projects/python-code/pythonFastapi']
3INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
4INFO:     Started reloader process [25075] using statreload
5INFO:     Started server process [25077]
6INFO:     Waiting for application startup.
7INFO:     Application startup complete.

  • uvicorn main:app 命令含义如下:

main:main.py 文件(一个 Python「模块」)。
app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
--reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。

在输出中,会有一行信息像下面这样:

1INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

该行显示了你的应用在本机所提供服务的 URL 地址。

查看
打开浏览器访问 http://127.0.0.1:8000

你将看到如下的 JSON 响应:

1{"message": "Hello World"}

交互式 API 文档
跳转到 http://127.0.0.1:8000/docs

你将会看到自动生成的交互式 API 文档(由 Swagger UI 提供):

图片

可选的 API 文档
前往 http://127.0.0.1:8000/redoc

你将会看到可选的自动生成文档 (由 ReDoc 提供):

图片

查看 openapi.json
如果你对原始的 OpenAPI 模式长什么样子感到好奇,其实它只是一个自动生成的包含了所有 API 描述的 JSON。

你可以直接在:http://127.0.0.1:8000/openapi.json 看到它。

它将显示以如下内容开头的 JSON:

 1{
 2    "openapi": "3.0.2",
 3    "info": {
 4        "title": "FastAPI",
 5        "version": "0.1.0"
 6    },
 7    "paths": {
 8        "/": {
 9            "get": {
10                "summary": "Root",
11                "operationId": "root__get",
12                "responses": {
13                    "200": {
14                        "description": "Successful Response",
15                        "content": {
16                            "application/json": {
17                                "schema": {}
18                            }
19                        }
20                    }
21                }
22            }
23        }
24    }
25}


分步编写脚本

步骤 1:导入 FastAPI

新建一个工程目录,在工程目录中新建一个.py文件(文件名称自定义即可)

from fastapi import FastAPI

FastAPI 是一个为你的 API 提供了所有功能的 Python 类。

步骤 2:创建一个 FastAPI

app = FastAPI()

这里的变量 appFastAPI 类的一个实例。

这个实例将是创建你所有 API 的主要交互对象。

这个 app 同样在如下命令中被 uvicorn 所引用:

PS E:\git_code\python-code\fastapiProject> uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['E:\\git_code\\python-code\\fastapiProject']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [8908] using statreload
WARNING:  The --reload flag should not be used in production on Windows.
INFO:     Started server process [12500]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

步骤 3:创建一个路径操作

  • 路径

这里的「路径」指的是 URL 中从第一个/起的后半部分。

所以,在一个这样的 URL 中:

https://www.baidu.com/items/foo

…路径会是:

/items/foo

「路径」也通常被称为「端点」「路由」

  • 操作

这里的「操作」指的是一种HTTP「方法」

下列之一:

  1. POST
  2. GET
  3. PUT
  4. DELETE

…以及更少见的几种:

  1. OPTIONS
  2. HEAD
  3. PATCH
  4. TRACE

在 HTTP 协议中,你可以使用以上的其中一种(或多种)「方法」与每个路径进行通信。

在开发 API 时,你通常使用特定的 HTTP 方法去执行特定的行为。

通常使用:

  1. POST:创建数据。
  2. GET:读取数据。
  3. PUT:更新数据。
  4. DELETE:删除数据。

因此,在 OpenAPI 中,每一个 HTTP 方法都被称为「操作」

我们也打算称呼它们为「操作」。

  • 定义一个路径操作装饰器
@app.get("/")

@app.get("/") 告诉FastAPI在它下方的函数负责处理如下访问请求:

  1. 请求路径为 /
  2. 使用 get 操作

你也可以使用其他的操作:

  1. @app.post()
  2. @app.put()
  3. @app.delete()

以及更少见的:

  1. @app.options()
  2. @app.head()
  3. @app.patch()
  4. @app.trace()

步骤 4:定义路径操作函数

这是我们的「路径操作函数」

路径:是 /。
操作:是 get。
函数:是位于「装饰器」下方的函数(位于 @app.get("/") 下方)。

@app.get("/")
def root():

这是一个 Python 函数。

每当 FastAPI 接收一个使用GET方法访问URL「/」的请求时这个函数会被调用。

当然你也可以定义为async 函数(也成为协程的异步代码):

@app.get("/")
async def root():

步骤 5:返回内容

@app.get("/")
async def root():
    return "hello world"

你可以返回一个 dictlist,像 strint 一样的单个值,等等。

你还可以返回 Pydantic 模型(后续了解)。

运行代码,并访问API

PS E:\git_code\python-code\fastapiProject> uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['E:\\git_code\\python-code\\fastapiProject']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [8908] using statreload
WARNING:  The --reload flag should not be used in production on Windows.
INFO:     Started server process [12500]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
WARNING:  StatReload detected file change in 'main.py'. Reloading...
WARNING:  The --reload flag should not be used in production on Windows.
INFO:     Started server process [6808]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

访问地址:http://127.0.0.1:8000/

访问地址:http://127.0.0.1:8000/docs

访问地址:http://127.0.0.1:8000/redoc

如果你对原始的 OpenAPI 模式长什么样子感到好奇,其实它只是一个自动生成的包含了所有API描述的JSON。访问地址:http://127.0.0.1:8000/openapi.json

{
    "openapi": "3.0.2",
    "info": {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths": {
        "/": {
            "get": {
                "summary": "Root",
                "operationId": "root__get",
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {
                                "schema": {}
                            }
                        }
                    }
                }
            }
        }
    }
}

今天先聊到这里吧,以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;非常期待你的一键④连【 赞赏、点赞、在看、分享 】哟,谢谢!

未完成,待续……

一直在努力,希望你也是!

微信号:waiting940601
文章作者:李锋;编辑排版:梁莉莉

更多内容欢迎关注公众号


版权声明:本文为LIFENG0402原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。