跳到主要内容

使用 FastAPI 运行 Flet

当将 Flet web 应用部署到生产环境时,Flet for FastAPI 会取代内置的 Flet web 服务器 (Fletd)。 由 UvicornHypercorn 或业界领先的 Gunicorn web 服务器运行的 FastAPI 应用,使您能够构建可靠、高性能的 Flet 应用。

现有的 FastAPI 开发者可以使用 Flet 轻松地向他们的 FastAPI 应用添加交互式、实时的仪表板。

安装

要安装 flet-fastapi,运行以下命令:

pip install flet-fastapi

示例应用

注意

Flet 应用(及其依赖库)必须是异步的,才能在 FastAPI 中运行。 查看本文了解如何编写异步的 Flet 应用, 我们还建议阅读 FastAPI 关于异步/等待的文章 以更好地理解并发和并行之间的区别。

创建 counter.py 文件,内容如下:

import flet as ft
import flet_fastapi

async def main(page: ft.Page):
counter = ft.Text("0", size=50, data=0)

async def add_click(e):
counter.data += 1
counter.value = str(counter.data)
await counter.update_async()

page.floating_action_button = ft.FloatingActionButton(
icon=ft.icons.ADD, on_click=add_click
)
await page.add_async(
ft.Container(counter, alignment=ft.alignment.center, expand=True)
)

app = flet_fastapi.app(main)

这是一个简单的应用,显示一个计数器和一个按钮,位于页面右下角,用于递增该计数器。

在本地运行应用

安装 Uvicorn web 服务器:

pip install uvicorn

使用以下命令启动 uvicorn

uvicorn counter:app

打开浏览器,访问 http://127.0.0.1:8000 查看运行中的应用。

工作原理

flet_fastapi.app() 在 FastAPI 应用的根目录配置一个单一的 Flet 应用,使用 main() 会话处理程序以及以下端点:

/ws (WS) - 用于 Flet 应用的 WebSocket 处理程序。当建立新的 WebSocket 连接并创建新的应用会话时,它会调用 main() 函数。

/upload (PUT) - 文件上传处理程序。

/oauth_callback (GET) - OAuth 流回调处理程序。

/ (GET) - Flet 应用静态文件,带有 SPA 捕获所有处理程序。

flet_fastapi.app() 参数:

  • fastapi_app (FastAPI) - FastAPI 应用实例。
  • session_handler (协程) - 应用入口点,一个异步方法,用于新连接的用户。处理程序协程必须有一个参数:page - Page 实例。
  • assets_dir (str, 可选) - 应用的资产目录的绝对路径。
  • app_name (str, 可选) - PWA 应用名称。
  • app_short_name (str, 可选) - PWA 应用简称。
  • app_description (str, 可选) - PWA 应用描述。
  • web_renderer (WebRenderer) - 默认为 WebRenderer.CANVAS_KIT 的 Web 渲染器。
  • use_color_emoji (bool) - 是否加载带有彩色表情符号的字体。默认为 False
  • route_url_strategy (str) - 路由 URL 策略:path (默认) 或 hash
  • upload_dir (str) - 上传文件的目录的绝对路径。
  • max_upload_size (str, int) - 单个上传的最大大小,以字节为单位。如果为 None,则无限制。
  • secret_key (str, 可选) - 用于签名和验证上传请求的密钥。
  • session_timeout_seconds (int, 可选) - 用户断开连接后的会话生命周期,以秒为单位。
  • oauth_state_timeout_seconds (int, 可选) - OAuth 状态生命周期,以秒为单位,即启动 OAuth 流并重定向到 OAuth 回调 URL 之间的最大允许时间。

在相同域下托管多个 Flet 应用

import flet as ft
import flet_fastapi


async def root_main(page: ft.Page):
await page.add_async(ft.Text("

This is root app!"))


async def sub_main(page: ft.Page):
await page.add_async(ft.Text("This is sub app!"))


app = flet_fastapi.FastAPI()


app.mount("/sub-app", flet_fastapi.app(sub_main))
app.mount("/", flet_fastapi.app(root_main))

子应用必须在根 Flet 应用之前映射,因为它配置了 SPA 的捕获所有 index.html

使用 uvicorn 运行应用,访问 http://127.0.0.1:8000http://127.0.0.1:8000/sub-app/ 查看两个 Flet 应用同时运行。请注意 /sub-app/ URL 中的尾随斜杠 - 如果没有斜杠,请求将路由到根应用。

将 Flet 添加到现有的 FastAPI 应用中

from contextlib import asynccontextmanager

import flet as ft
import flet_fastapi
from fastapi import FastAPI

@asynccontextmanager
async def lifespan(app: FastAPI):
await flet_fastapi.app_manager.start()
yield
await flet_fastapi.app_manager.shutdown()

app = FastAPI(lifespan=lifespan)

async def main(page: ft.Page):
await page.add_async(ft.Text("Hello, Flet!"))

app.mount("/flet-app", flet_fastapi.app(main))

在将 Flet 应用添加到现有的 FastAPI 应用中时,您需要在应用启动时调用 flet_fastapi.app_manager.start(),并在关闭时调用 flet_fastapi.app_manager.shutdown()。使用适合您的方式:生命周期 (如上面的示例) 或应用事件。

app_manager.start() 方法启动后台任务,清理过期的会话和 OAuth 流状态。

app_manager.shutdown() 方法删除由 Flet 应用创建的任何临时文件。

配置单个 Flet 端点

静态文件

用于提供静态 Flet 应用文件(index.html、manifest.json、Flutter JS 应用等)和用户资产的 FastAPI 应用。

from flet_fastapi import FastAPI, FletStaticFiles

app = FastAPI()

# 挂载到 web 应用的根目录
app.mount(path="/", app=FletStaticFiles())

FletStaticFiles 构造函数的参数:

  • app_mount_path (str) - Flet 应用的绝对 URL。默认为 /
  • assets_dir (str, 可选) - 应用的资产目录的绝对路径。
  • app_name (str, 可选) - PWA 应用名称。
  • app_short_name (str, 可选) - PWA 应用简称。
  • app_description (str, 可选) - PWA 应用描述。
  • web_renderer (WebRenderer) - 默认为 WebRenderer.CANVAS_KIT 的 Web 渲染器。
  • use_color_emoji (bool) - 是否加载带有彩色表情符号的字体。默认为 False
  • route_url_strategy (str) - 路由 URL 策略:path (默认) 或 hash
  • websocket_endpoint_path (str, 可选) - Flet 应用 WebSocket 处理程序的绝对 URL。默认为 {app_mount_path}/ws

WebSocket 处理程序

处理来自浏览器中运行的 Flet 客户端应用的 WebSocket 连接。WebSocket 通道用于将事件从浏览器发送到 Flet 后端代码,并接收页面实时增量更新。

from flet_fastapi import FletApp

async def main(page: ft.Page):
await page.add_async(ft.Text("Hello, Flet!"))

@app.websocket("/app1/ws")
async def flet_app(websocket: WebSocket):
await FletApp(main).handle(websocket)
  • session_handler (协程) - 应用入口点,一个异步方法,用于新连接的用户。处理程序协程必须有一个参数:page - Page 实例。
  • session_timeout_seconds (int, 可选) - 用户断开连接后的会话生命周期,以秒为单位。
  • oauth_state_timeout_seconds (int, 可选) - OAuth 状态生命周期,以秒为单位,即启动 OAuth 流并重定向到 OAuth 回调 URL 之间的最大允许时间。
  • upload_endpoint_path (str, 可选) - 上传端点的绝对 URL,例如 /upload
  • secret_key (str, 可选) - 用于签名上传请求的密钥。

上传处理程序

处理 FilePicker 控件的文件上传。此端点是可选的 - 如果您的应用不使用 FilePicker 则不需要它。

from flet_fastapi import FletUpload

@app.put("/upload")
async def flet_uploads(request: Request):
await FletUpload("/Users/feodor/Downloads/123").handle(request)

OAuth 回调处理程序

处理 OAuth 流回调请求。如果您的应用不使用 身份验证,则不需要此端点。

from flet_fastapi import FletOAuth

@app.get("/oauth_callback")
async def flet_oauth(request: Request):
return await FletOAuth().handle(request)

在生产环境中运行应用

Uvicorn

Uvicorn,一个基于 uvloop 和 httptools 构建的快速 ASGI 服务器。

要安装 Uvicorn:

pip install uvicorn

使用 Uvicorn 运行应用,监听所有 NIC IP 和端口 8000

uvicorn --host 0.0.0.0 --port 8000 main:app

Hypercorn

Hypercorn 是受 Gunicorn 启发的另一个 ASGI Web 服务器。

要安装 Hypercorn:

pip install hypercorn

使用 Hypercorn 运行应用:

hypercorn --bind 0.0.0.0:8000 main:app

G

unicorn

Gunicorn 是运行 Python Web 应用的流行 Web 服务器。虽然它实现了 WSGI 规范,但可以使用 Uvicorn 提供的 worker process class 来运行 ASGI FastAPI 应用。

要安装 Gunicorn:

pip install gunicorn

使用以下命令启动 gunicorn

gunicorn --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker counter:app