我需要通过 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 部分有更新时,我都想激活消费者发送方法。