手动运行服务器¶
使用 fastapi run 命令¶
简而言之,使用 fastapi run 来服务你的 FastAPI 应用:
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> 正在启动生产服务器 🚀
从包含 <font color="#3465A4">__init__.py</font> 文件的目录中
搜索包文件结构
从 <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> 导入
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> 使用以下代码从模块中导入 FastAPI app 对象:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> 使用导入字符串:<font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> 服务器已启动于 <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> 文档位于 <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
日志:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> 已启动服务器进程 <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> 等待应用启动。
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> 应用启动完成。
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn 运行于 <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>按 CTRL+C
退出<b>)</b>
这在大多数情况下都适用。😎
例如,你可以使用该命令在容器、服务器等中启动你的 FastAPI 应用。
ASGI 服务器¶
让我们更深入地了解一些细节。
FastAPI 使用一个名为 ASGI 的标准来构建 Python Web 框架和服务器。FastAPI 是一个 ASGI Web 框架。
在远程服务器机器上运行 FastAPI 应用(或任何其他 ASGI 应用)的主要需求是一个 ASGI 服务器程序,如 Uvicorn,这是 fastapi 命令默认附带的。
有几种替代方案,包括:
- Uvicorn:一个高性能的 ASGI 服务器。
- Hypercorn:一个兼容 HTTP/2 和 Trio 等特性的 ASGI 服务器。
- Daphne:为 Django Channels 构建的 ASGI 服务器。
- Granian:一个用于 Python 应用的 Rust HTTP 服务器。
- NGINX Unit:NGINX Unit 是一个轻量级且多功能的 Web 应用运行时。
服务器机器与服务器程序¶
关于名称有一个小细节需要注意。💡
“服务器”一词通常用于指代远程/云计算机(物理或虚拟机)以及在该机器上运行的程序(例如 Uvicorn)。
请记住,当你读到“服务器”时,它可能指的是这两者之一。
当指代远程机器时,通常称其为 服务器,但也称为 机器、VM(虚拟机)、节点。这些术语都指某种类型的远程机器,通常运行 Linux,你在上面运行程序。
安装服务器程序¶
当你安装 FastAPI 时,它会附带一个生产服务器 Uvicorn,你可以使用 fastapi run 命令启动它。
但你也可以手动安装一个 ASGI 服务器。
确保你创建了一个虚拟环境,激活它,然后你可以安装服务器应用。
例如,安装 Uvicorn:
$ pip install "uvicorn[standard]"
---> 100%
类似的过程适用于任何其他 ASGI 服务器程序。
Tip
通过添加 standard,Uvicorn 将安装并使用一些推荐的额外依赖项。
这包括 uvloop,它是 asyncio 的高性能替代品,提供了巨大的并发性能提升。
当你使用类似 pip install "fastapi[standard]" 的命令安装 FastAPI 时,你也会得到 uvicorn[standard]。
运行服务器程序¶
如果你手动安装了一个 ASGI 服务器,通常需要以特殊格式传递一个导入字符串来导入你的 FastAPI 应用:
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
Note
命令 uvicorn main:app 指的是:
main:文件main.py(Python “模块”)。app:在main.py中通过app = FastAPI()创建的对象。
它等同于:
from main import app
每个替代的 ASGI 服务器程序都会有类似的命令,你可以在它们各自的文档中阅读更多信息。
Warning
Uvicorn 和其他服务器支持 --reload 选项,这在开发过程中很有用。
--reload 选项消耗更多资源,更不稳定等。
它在开发过程中有很大帮助,但你不应在生产环境中使用它。
部署概念¶
这些示例运行服务器程序(例如 Uvicorn),启动单个进程,监听预定义端口(例如 80)上的所有 IP(0.0.0.0)。
这是基本概念。但你可能还需要处理一些额外的事情,例如:
- 安全性 - HTTPS
- 启动时运行
- 重启
- 复制(运行的进程数)
- 内存
- 启动前的预备步骤
我将在接下来的章节中告诉你更多关于这些概念的信息,如何思考它们,以及一些具体的示例和策略来处理它们。🚀