作为动态网站托管应用
介绍
Flet 实现了 FastAPI 应用程序来将您的应用程序运行为动态网 站。
默认情况下,它使用 Uvicorn 网络服务器来运行应用程序,但也可以使用任何兼容 ASGI 的服务器。
同步和异步处理程序
在 Flet web 应用中,您可以在同一个应用中混合使用同步和异步方法。
例如,您可以编写如下应用:
import flet as ft
import time
import asyncio
def main(page: ft.Page):
def handler(e):
time.sleep(3)
page.add(ft.Text("Handler clicked"))
async def handler_async(e):
await asyncio.sleep(3)
page.add(ft.Text("Async handler clicked"))
page.add(
ft.ElevatedButton("Call handler", on_click=handler),
ft.ElevatedButton("Call async handler", on_click=handler_async)
)
ft.app(main)
在这个示例中,点击一个按钮由“阻塞”处理程序处理,而点击另一个按钮调用异步处理程序。第一个处理程序在 threading.Thread
中运行,而第二个处理程序作为 asyncio.Task
运行。
在 web 应用中,使用线程是应用扩展性的一个考虑因素,因为线程是有限资源。通常使用线程池,但随着用户数量的增加,它可能成为瓶颈。
无论如何,如果您的应用主要进行 I/O 操作(数据库、web API)并且/或者您能够使用支持异步的库,我们建议实现异步处理程序。
查看 FastAPI 关于 async/await 的文章以更好地了解并发性和并行性的区别。
本地运行应用
使用 --web
(-w
) 选项启动 Flet 应用作为 web 应用:
flet run --web app.py
将打开一个新的浏览器窗口/标签页,应用将使用随机 TCP 端口。
要在固定端口上运行,请使用 --port
(-p
) 选项:
flet run --web --port 8000 app.py
在生产环境中运行应用
您可以直接使用 python
命令运行程序:
python app.py
默认情况下使用 Uvicorn 网络服务器托管 web 应用。
如果 Flet 检测到应用在无头 Linux 环境(如 Docker 容器或 EC2 VM)中运行:
- 使用端口
8000
运行应用。 - 不会打开带有应用的浏览器窗口。
如果由于某种原因 Flet 无法检测到无头环境,您可以通过定义以下环境变量强制这种行为:
FLET_FORCE_WEB_SERVER=true
ASGI 网络服务器
您可以使用任何兼容 ASGI 的服务器托管您的 Flet web 应用,如默认使用的 Uvicorn、Hypercorn 或 Daphne。
只需告诉 Flet 导出 ASGI 应用:
import flet as ft
def main(page: ft.Page):
page.add(ft.Text("Hello ASGI!"))
app = ft.app(main, export_asgi_app=True)
Hypercorn
Hypercorn 是另一个受 Gunicorn 启发的 ASGI 网络服务器。
使用 Hypercorn 运行应用:
hypercorn main:app --bind 0.0.0.0:8000
Daphne
Daphne 是一个用于 ASGI 和 ASGI-HTTP 的 HTTP、HTTP2 和 WebSocket 协议服务器,开发用于支持 Django Channels。
使用 Daphne 运行应用:
daphne -b 0.0.0.0 -p 8000 main:app
Gunicorn
Gunicorn 是运行 Python web 应用的流行网络服务器。虽然它实现了 WSGI 规范,但可以使用 Uvicorn 提供的工作进程类运行 ASGI FastAPI 应用:
gunicorn --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker counter:app
资源
当您在浏览器中打开 Flet 应用时,它的 index.html
、Flutter 引擎、favicon、图片和其他 web 应用资源由网络服务器提供。这些资源与 flet
Python 包一起打包。然而,有时您需要修改某些文件的内容以自定义应用的外观或行为,例如:
- Favicon。
- 应用加载动画。
- 带有 PWA 详细信息的
manifest.json
。
您可以在 flet.app()
调用中指定 assets_dir
以设置应用可用的资源位置。assets_dir
应该是相对于 main.py
目录的相对路径或绝对路径。assets_dir
参数的默认值是 assets
。
例如,考虑以下程序结构:
/assets
/images/my-image.png
main.py
您可以在应用中按如下方式访问您的图片:
import flet as ft
def main(page: ft.Page):
page.add(ft.Image(src=f"/images/my-image.png"))
ft.app(main, assets_dir="assets")