ich arbeite nun mit Websockets (Flask-Socketio) um einen Chat zu entwickeln, es soll ein privater Chat sein (immer 2 Personen reden miteinander).
Die Nachrichten speichere ich in einer PostgreSQL DB, hier schonmal das Model:
Code: Alles auswählen
class ChatMessage(Base):
__tablename__ = 'chatmessages'
id = Column(Integer, primary_key=True)
chat_message = Column(Text, nullable=False)
date_added = Column(DateTime, nullable=False)
message_seen_by_adressed_user = Column(Boolean, nullable=False, default=False)
# Foreign Keys
message_from_user_id = Column(Integer, ForeignKey('users.id'))
# Foreign Keys
message_to_user_id = Column(Integer, ForeignKey('users.id'))
Code: Alles auswählen
class User(UserMixin, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(Text, nullable=False, unique=True)
password = Column(Text, nullable=False)
chat_room = Column(Text, nullable=False, unique=True)
# etc.
# Foreign Keys for chat
message_from_user_id_addresses = relationship('ChatMessage', backref='message_from', primaryjoin=id==ChatMessage.message_from_user_id)
message_to_user_id_addresses = relationship('ChatMessage', backref='message_to', primaryjoin=id==ChatMessage.message_to_user_id)
Ich komme mit Socket.io ganz gut zu recht, habe schon einen funktionierenden global chat, und für den private chat hat jeder Nutzer einen unique chat_room string. Dieser wird random generated wenn ein Nutzer sich registriert und ich plane diesen zu nutzen, wenn private messages geschickt werden sollen.
Ich habe gerade Schwierigkeiten die Chats der jeweiligen User korrekt zu laden und zu gruppieren.
Ich kann Chat Nachtichten entweder über die User Relationen laden:
Code: Alles auswählen
for a_user in current_user.message_from_user_id_addresses:
print ('sent', a_user.chat_message, 'to', a_user.message_to_user_id)
for a_user in current_user.message_to_user_id_addresses:
print ('received', a_user.chat_message, 'from', a_user.message_from_user_id)
Code: Alles auswählen
all_messages_user = ChatMessage.query.filter(or_(ChatMessage.message_from_user_id == current_user.id, ChatMessage.message_to_user_id == current_user.id)).order_by(asc('date_added')).all()
for message in all_messages_user:
print (message.chat_message, 'from', message.message_from_user_id, 'to', message.message_to_user_id)
Ich möchte nun in der view mit einem for if loop gruppieren können und alle nachrichten zwischen zwei Nutzern laden
D.h. in diesem Fall möchte ich alle Nachrichten von 2 zu 3 und 3 zu 2 seperat haben von den Nachtichten von 1 zu 3 usw., so dass ich in der view die dazugehörigen Userpärchen habe und die Chat History anzeigen kann.
Ich weiß es ist eine lange Frage, falls sich jemand tatsächlich die Zeit nimmt, wäre ich sehr dankbar!
P.S. Ich würde Nachrichten auch nur für einen bestimmten Zeitraum in der DB lassen, zum beispiel 1 Woche, ältere Nachrichten würde ich mit einem Cronjob löschen, so dass es nicht in Zukunft zu Performance Problemen kommt, wenn es mehere tausend nachrichten von einem User gibt