首页
开发技巧正文内容

FastAPI WebSockets - 使用FastAPI创建实时投票应用

2023年10月23日
阅读时长 2 分钟
阅读量 25
FastAPI WebSockets - 使用FastAPI创建实时投票应用

FastAPI实时投票应用 - abdadeel

FastAPI是一个以速度和性能著称的Python Web框架。在本文中,我们将使用FastAPI和Next.js构建一个实时投票系统。该应用程序允许用户实时创建投票并对其进行投票,我们将使用Tailwind CSS进行样式设置,使用SqlModel进行数据库交互。

让我们逐步了解我是如何创建这个实时投票应用的。

设置后端

我们将首先创建一个全新的FastAPI项目并设置数据库连接。然后,我们将使用SqlModel创建此应用程序所需的模型,SqlModel在底层结合了Pydantic和SQLAlchemy的功能。以下是我们需要的所有模型。

Poll 模型用于存储所有投票。

投票模型 - SqlModel | abdadeel

Options 模型用于存储这些投票的可选答案。

选项模型 - SqlModel | abdadeel

Vote 模型用于保存所有投票。

除了这些模型,应用程序还提供了一些REST端点。

一个GET端点用于获取当前用户创建的所有投票。

另一个GET端点用于按ID获取投票。

一个DELETE端点用于删除投票。

一个POST端点用于对特定选项进行投票。

添加WebSocket端点

在FastAPI中处理WebSocket连接非常简单。以下是我实时投票应用程序仅暴露的WebSocket端点的代码。

首先,有一个路径参数,表示用户当前所在的投票的ID。这意味着后端应该将该投票的任何更新实时发送到传入的连接。然后有一个简单的数据库查询,检查是否实际存在具有该ID的问题。否则,内存中将存在悬空连接,这不是您想要的。

之后,只需接受该连接并将连接交给管理器。

连接管理器是一个单独的类,用于将所有连接逻辑放在一个地方。以下是该类的样子。

它只是在一个字典中跟踪所有问题及其连接的客户端,其中键是投票的ID,值是所有WebSocket连接的集合。最好将连接保存在集合中,而不是列表中,以避免重复条目和线性删除操作。

发送实时更新

现在,每当为投票创建新的投票时,将向该特定投票的所有连接的客户端发布更新信息,以实时更新UI。

设置前端

我们将使用Next.js作为应用程序的前端。我们将创建一个简单的用户界面,用户可以在其中创建投票并对其进行投票。我们将使用Tailwind CSS进行样式设置。

我们将为此应用程序创建三个主要页面:

  1. 投票主页,用于显示当前用户创建的所有投票。

  2. 创建投票页面。

  3. 投票页面,用于对特定投票进行投票。

这些页面只需通过REST端点获取它们感兴趣的数据,并在UI上显示它们。值得一提的是投票详情页面。该页面在 q/[qid] 动态路由上呈现。这里的 qid 是投票的ID。此ID将用于获取当前投票的数据并显示它。

一旦我们有了投票ID,我们就可以打开与后端的WebSocket连接。使用来自参数的ID连接到WebSocket端点。将事件监听器附加到WebSocket实例,以在投票上投票时更新前端的状态。

该应用程序允许用户实时创建投票并对其进行投票,我们将使用Tailwind CSS进行样式设置,使用SqlModel进行数据库交互。借助FastAPI的WebSocket功能,我们将确保所有连接的客户端在投票更新时接收实时更新。对于希望了解更多关于FastAPI和Web开发中的实时通信的开发人员来说,本教程非常适合。

同样,如果您愿意,您可以观看此视频以获取更多详细信息并查看演示应用程序。 FastAPI Websockets | 使用FastAPI创建实时投票应用 | abdadeel - YouTube

GitHub仓库链接👇

mabdullahadeel/fast-vote: 使用FastAPI创建的实时投票应用

免责声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

相关文章

探索多种软件架构模式及其实用应用
2024年11月22日19:06
本文深入探讨了多种软件架构模式,包括有界上下文、边车模式、发布-订阅模式、应用网关、微服务、命令职责分离(CQRS)等,介绍了它们的优点、使用场景以及具体应用实例。文章强调根据具体项目需求和团队能力选择最合适的架构,以构建高效和可维护的解决方案,同时展示了各架构模式间的综合应用,提供了丰富的案例和技术细节。
15个高级Python快捷键助您更快编程
2024年11月21日07:02
本文分享了 15 个高级的 Python 编程快捷键,包括上下文管理器、行内字典合并、函数参数解包、链式比较、dataclasses、海象运算符、反转列表、备忘录缓存、splitlines、enumerate、字典推导、zip 用于并行迭代、itertools.chain 扁平化列表、functools.partial 部分函数和 os.path 文件路径管理等,帮助开发者提高编程效率和代码简洁性。
揭示网页开发的 11 个迷思:停止相信这些误区
2024年11月19日22:05
网页开发充满误解,这篇博文针对11个常见迷思进行揭秘。包括网站开发后不需更新、需掌握所有技术、AI会取代开发者等。强调持续学习、专业化、用户体验的重要性,澄清误区如多任务处理的必要性和最新技术的必需性。文章提醒开发者注重实用而非追求完美代码,以务实态度面对开发工作。
你知道 CSS 的四种 Focus 样式吗?
2024年11月18日21:41
本文介绍了四种 CSS focus 样式::focus、:focus-visible、:focus-within 以及自定义的 :focus-visible-within,帮助提升网站用户体验。:focus 样式应用于被选中元素;:focus-visible 仅在键盘导航时显示;:focus-within 用于父元素;自定义 :focus-visible-within 结合两者效果。合理运用这些样式能使网站更方便键盘用户导航。
利用 Python 实现自动化图像裁剪:简单高效的工作流程
2024年11月11日20:49
使用 Python 和 OpenCV 自动裁剪图像,轻松实现 16:9 的完美构图。这个指南介绍了如何通过代码进行灰度化、模糊处理和边缘检测,最终识别出最重要的部分进行裁剪。特别适合需要批量处理图像的情况,节省大量时间。
每位资深前端开发人员都应了解的 TypeScript 高级概念
2024年11月11日02:07
资深前端开发者应了解 TypeScript 的高级概念,如联合类型、交叉类型、类型保护、条件类型、映射类型、模板字面量类型和递归类型。这些特性可提升代码的可维护性和可扩展性,确保在开发复杂应用时实现更高的类型安全性和效率。