在现今社交网络大行其道的时代,即时通讯已成为人们日常生活不可或缺的一部分。本篇文章将介绍如何基于 Flask-SSE 实现一个简单的在线聊天室。
Flask-SSE
Flask-SSE 提供了简单易用的 Flask 扩展,用于处理服务器推送事件。它是基于 WSGI 的服务器,可以将信息通过 Server-Sent Event 方式发送到客户端。借助 Flask-SSE,我们可以在 Flask 应用程序中实现事件驱动的服务器推送,例如实时财经新闻、即时通讯、股票数据等。
如果你还不熟悉 Flask-SSE,建议先查看 官方文档 及其 GitHub 页面。
聊天室实现
Flask 应用程序
首先,创建一个 Flask 应用程序,用于处理聊天室中的各种交互。
from flask import Flask, render_template, request, jsonify, session from flask_sse import sse from datetime import datetime app = Flask(__name__) app.config["SECRET_KEY"] = "secretkey" app.register_blueprint(sse, url_prefix="/stream")
其中,app.config["SECRET_KEY"]
用于指定 session 的密钥;app.register_blueprint(sse, url_prefix="/stream")
则用于指定 SSE 扩展的 URL。
页面结构
我们将会实现一个简单的 HTML 页面作为聊天室的界面。首先,创建 views.py,编写视图函数,用于渲染聊天室的 HTML 页面。
@app.route("/") def index(): if "username" not in session: return render_template("login.html") return render_template("index.html", username=session["username"])
渲染 index.html 页面,其中包含三部分内容:
- 聊天区域,用于显示历史聊天记录
- 消息输入框,用户可以在其中输入消息
- 发送按钮,用于将消息推送到聊天室的其他用户
-- -------------------- ---- ------- --------- ----- ------ ------ ------------ ---- --------------- ----- ---------------- ------- ------ --------- ---- ------------ ---- --------------------- ----- ------------------ ------ ----------- ------------------ ---------------------- ------- --------------------------- ------- ------- ----------------------------------------------------------------------- ------- --------------------------------- ------- -------
这里使用了 jQuery 库,当然也可以使用其他类似库,如 Axios、Fetch 等。
后端代码
登录
在 login.html 页面中,用户需要输入自己的用户名,之后在 session 中保存记录。如果已经存在 session,则跳过此步骤。
-- -------------------- ---- ------- --------- ----- ------ ------ -------------------- ----- ---------------- ------- ------ --------- ---- ------- - ---------- ----- ---------------- ------ ----------- ------------------- ----------------------- ------- ---------------------------- ------- ------- ----------------------------------------------------------------------- ------- ----------------------------------- ------- -------
在 Flask 中,我们需要定义 login 的 route。其中,使用了 session.permanent = True
将 session 保存到用户的浏览器中,以便下次登录时自动登录。
@app.route("/login", methods=["POST"]) def login(): username = request.form["username"] session["username"] = username session.permanent = True return jsonify({"success": True})
消息推送
利用 Flask-SSE,我们可以在客户端连接到服务器时,开启一个连接,并在其中发送信息。这样子,当有其他用户发送消息时,会推送到所有连接上的客户端,从而实现即时推送的效果。
-- -------------------- ---- ------- ------------------- ----------------- --- ------- ------- - - ----------- -------------------- ------- --------------------- ------------- ------------------- - -------------------- ------------ ------ ------------------- ------
这里使用了 Flask-SSE 提供的 publish()
函数,将信息推送到所有连接的客户端上。
前端代码
前端代码主要有两个部分:登录以及聊天室消息推送。
登录部分
当用户在登录页面输入用户名并提交时,我们需要将用户名发送到服务器进行验证。
-- -------------------- ---- ------- -------- ----- -- - ---------------------- --- ------------- - ----------------------------------------- --- -------- - ------------------- --------------- - ------- ------- ----- --------------------------- ----------- -------- - --------------- ------------------ - -- -------------- -- ---------------- ---------- -- - -- -------------- - ---------------------------- - -- -
消息推送
当用户输入消息并点击发送按钮时,我们需要将消息推送到服务器进行广播。
-- -------------------- ---- ------- -------- ----------- -- - ---------------------- --- ----- - ---------------------------------------- --- ---- - ------------------ -- ------- - ------ - --- ---- - --- ---------- ------------------- ----- -------------- - ------- ------- ----- ----- -- -------- -- - ----------- - -- -- - --- ------ - --- ---------------------- ------------------------------- -------- ------- - --- ---- - ---------------------- --- -------- - ------------------------------------ --- -------------- - ----------------------------- --- ---- - ------------- - -- - - --------- - - - - - --------------- ------------------------ - ---- ------------------------------------ --
在这里,我们使用 EventSource 对象建立持久连接,当有新消息递交到服务器时,服务器会发送相关数据到客户端并触发相应的事件,从而让我们实现实时聊天室。
总结
本篇文章介绍了如何使用 Flask-SSE 实现简单的在线聊天室。在实现的过程中,我们使用了 Flask、Flask-SSE、jQuery 等工具和库,并且建议读者仔细阅读 Flask-SSE 的文档及源代码,探索 Flask-SSE 的更多特性和用法,进一步提升我们的编程能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d4ae6cb5eee0b525c8054f