You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中使用HTMX与WebSockets时消息无法实时显示的问题

修复HTMX WebSocket聊天实时消息显示问题

以下是解决你问题的关键修复步骤:


1. 修正消息容器ID匹配问题

在chat.html中,消息列表的<div>需要添加与OOB部分匹配的ID:

<!-- 原代码 -->
<div class="chat_messages" >
<!-- 修改为 -->
<div class="chat_messages" id="chat-messages">

你的OOB模板(chat_message_p.html)使用hx-swap-oob="beforeend"指向#chat-messages,但原页面中没有这个ID的元素,导致htmx无法找到目标位置插入新消息。

2. 补全新消息的结构包装

现有消息都被<div class="message-row ...">包裹,但你的OOB部分缺少这个结构。更新chat_message_p.html:

<div id="chat-messages" hx-swap-oob="beforeend">
  <div class="message-row {% if message.author.user == user %}my-message{% else %}other-message{% endif %}">
    {% include "chat_rt/chat_message.html" %}  
  </div>
</div>

这样新消息会和现有消息保持一致的DOM结构与样式。

3. 修改Consumer发送原始HTML而非JSON

htmx-ext-ws默认会直接处理WebSocket收到的HTML内容(包括OOB交换),但你的Consumer现在发送的是JSON对象。更新consumers.py中的send部分:

# 原代码
self.send(text_data=json.dumps({
    "content": html,
    "target": "#chat-messages",
    "swap": "beforeend"
}))
# 修改为
self.send(text_data=html)

直接发送渲染好的HTML,htmx会自动识别并执行OOB交换。

4. (可选)广播消息到所有聊天室用户

当前Consumer只将消息发回给发送者,若要让其他在线用户也看到实时消息,需要加入聊天室组并广播:

# 在connect方法中加入组
def connect(self):
    print("WebSocket connecting...")
    self.user = self.scope['user']
    self.chatroom = get_object_or_404(ChatGroup, group_name='private_chat')
    self.group_name = self.chatroom.group_name
    # 加入组
    async_to_sync(self.channel_layer.group_add)(
        self.group_name,
        self.channel_name
    )
    print("WebSocket connected!")
    self.accept()

# 在receive方法中广播而非仅发送给自身
async_to_sync(self.channel_layer.group_send)(
    self.group_name,
    {
        'type': 'chat_message',
        'html': html
    }
)

# 添加处理组消息的方法
def chat_message(self, event):
    html = event['html']
    self.send(text_data=html)

注意:使用channel_layer需要确保Channels配置正确(如Redis作为后端)。


完成以上修复后,新消息应该会实时显示在聊天窗口中,无需刷新页面。

内容的提问来源于stack exchange,提问作者Soham Sarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:43:16