Django - Firebase 实时聊天系统

时间:2021-07-18 16:57:29

标签: django firebase websocket chat

我需要通过 firebase 实时数据库在 django 应用程序和 android 应用程序之间创建一个聊天系统。 我使用 Pyrebase4 处理 firebase,使用 Channels 处理套接字连接。

我有一个监听器,可以监听 Firebase 实时数据库内聊天室的任何变化 加载页面时会激活监听器:

from accounts.firebase_repo import db

def listen_to_chat(request, patient_key):

    doctor_id = request.user.id
    chat_id = f"{patient_key}_{doctor_id}"

    db.child("Chats").child(chat_id).stream(stream_handler)  

stream_handler 回调:

def stream_handler(event):

    acc = AsyncChatConsumer()
    asyncio.run(acc.receive(event['data']))

AsyncChatConsumer 类:

class AsyncChatConsumer(AsyncWebsocketConsumer):
    
    async def connect(self): 
        await self.accept()

    async def disconnect(self, message):
        pass

    async def receive(self, text_data=None, bytes_data=None):
 
        # json_to_send = {}

        if text_data is not None:
            if 'message' not in text_data:
                # this is triggered on page load. Fetches all of the messages inside the room
                await self.send(text_data) 
            else:
                # this is triggered when a new message is posted in the Firebase
                await self.send(text_data) 

send 方法应该触发我的 javascript 代码。 我有一个在加载 DOM 时初始化的 chatSocket:

  window.addEventListener('DOMContentLoaded', (event) => {
        initializeSocket(
            "{{ context.key }}", 
            "{{ context.doctor_id }}",  
            "{% url 'send_message' %}"
        );
    });
chatSocket = new WebSocket(wsStart + loc.host + '/ws/chat/' + roomName + '/');

chatSocket.onmessage = function (e) {

        console.log(e.data)
        const data = JSON.parse(e.data);
        const recieved_msg = data.message

        const chatContainer = document.getElementById("chat-messages-window");
        let message = document.createElement("p");
        message.innerHTML = recieved_msg;
        message.classList.add('doctor-message');
        message.style.color = "black";
        message.style.fontSize = "1.3rem";

        // add message to chat window
        chatContainer.appendChild(message);
    };

消费者的 receive 函数被调用,但是一旦消费者尝试使用它的 send 方法,我就会收到此错误:

AttributeError: 'AsyncChatConsumer' object has no attribute 'base_send'

我搜索了类似的案例,但没有找到。 Channels 文档展示了如何制作一个聊天应用程序,将它的内容存储在本地数据库中,而我需要读取和写入 Firebase 数据库。 我不知道为什么会引发此错误。我正在创建一个从另一个类继承的类的对象,该类显然应该具有 base_send 方法,但我无法弄清楚。 感谢您对此事的每一个看法。

注意 - chatSocket 对象有一个 send 方法,我可以在发送消息时从前端激活该方法。消费者对象中的 receive 函数被调用,在这种情况下,没有错误,消费者正在按预期发送消息。每次我正在收听的 Firebase 部分有更新时,我都想激活消费者发送方法。

0 个答案:

没有答案