1

シンプルなライブチャットをDjangoで実行されているWebアプリケーションに組み込んでいますが、混乱していることの1つは、ユーザー間のメッセージをどのように保存するかです。

チャットは複数のユーザーをサポートし、チャットの「セッション」は「ホスト」である1人のユーザーに接続されたユーザーで構成されます。このアプリケーションは一種のオンラインドキュメントコラボレーションであるため、ユーザーXはドキュメントを持っており、ユーザーYとZはユーザーXに接続してドキュメントについて話し、それが1つのチャットセッションになります。

ユーザーYが5分間切断した後、再度サインインしてユーザーXに再接続した場合、ユーザーYは、不在中にユーザーXとZの間で共有されたメッセージを受信しないはずです。

ユーザーX、Y、およびZがユーザーXのドキュメントに関するチャットセッションを行うことができる場合、ユーザーXとYは、ユーザーZのドキュメントに関する同時の個別のディスカッションに接続できます。

これをどのように処理すればよいですか?各メッセージをデータベースに保存する必要がありますか?各メッセージには所有者ユーザーとターゲットユーザー(ホスト)があり、個別のテーブルを使用してユーザーをメッセージ(どのメッセージがどのユーザーに表示されるか)に接続します。

または、各セッションをHTMLファイルとしてサーバーに保存する必要がありますか?どのメッセージが追加されますか?

問題は、クライアント間で直接メッセージを送信することはできないということです。それらはPOSTリクエストでサーバーに送信する必要があり、その後、各クライアントはGETリクエストでメッセージを定期的にチェックする必要があります。複数のクライアントが存在する可能性があるため、クライアントがメッセージをフェッチした後に各メッセージをクリアすることはできません。これをどのように設定すればよいですか?助言がありますか?

4

1 に答える 1

2

各メッセージにタイムスタンプ(または単に増分ID)を付けます。次に、クライアントがプールするときに、過去10秒間に発生した現在のチャットに属するすべてのメッセージと、それらのタイムスタンプをクライアントに送信します。クライアントは、すでに受け取っているメッセージを除外できます。5秒ごとにプールされます。ロギングなどのメッセージが不要な場合は、10秒以上経過したメッセージを削除できます。

本当に速くて反応が良いと感じるチャットを実装したい場合は、ReverseAjaxの使用を検討する必要があることに注意してください。その場合、答えは異なります。サーバーには、各チャットに登録されているクライアントのリストが必要です(HttpRequestが保留になっているクライアント)。次に、サーバーは、投稿されたすべてのメッセージをそれぞれに送信します。

そして、車輪の再発明をする前に検索することを忘れないでください。djangoの最高の機能の1つは、プラグイン可能なアプリのアーキテクチャです。

于 2010-05-07T11:01:57.487 に答える