Django 使用 AJAX 轮询实现聊天功能

82 阅读2分钟

我想创建一个类似于 Facebook 聊天的聊天室。我的想法是创建一个简单的 Chat 应用程序,然后使用 AJAX 轮询(每 2-3 秒发送一次请求)来实现聊天功能。我想知道这种方法是否可行。

2、解决方案

我建议使用一种由服务器控制的推送/实时消息传递的方式。这样,您可以获得真正的实时聊天功能,并且它将具有更好的可扩展性。您可以参考 www.orbited.org/,我认为这是一个不错的… Django 的核心功能,但它是 Python,并且可以很好地与 Django 应用程序一起在您的服务器上运行。

以下是一些使用 AJAX 轮询实现聊天功能的步骤:

  1. 在您的 Django 项目中创建一个新的应用程序,名为 "chat"。
  2. 在 chat 应用程序中创建一个新的模型,名为 "Message"。
  3. 在 chat 应用程序中创建一个新的视图,名为 "chat_view"。
  4. 在 chat 应用程序中创建一个新的模板,名为 "chat.html"。
  5. 在 JavaScript 中创建一个新的文件,名为 "chat.js"。
  6. 在您的 Django 项目的 settings.py 文件中,添加以下内容:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'chat',
]
  1. 在您的 Django 项目的 urls.py 文件中,添加以下内容:
from django.conf.urls import url
from chat import views

urlpatterns = [
    url(r'^chat/$', views.chat_view, name='chat'),
]
  1. 在您的 chat 应用程序的 models.py 文件中,添加以下内容:
from django.db import models

class Message(models.Model):
    text = models.TextField()
    sender = models.ForeignKey(User)
    receiver = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text
  1. 在您的 chat 应用程序的 views.py 文件中,添加以下内容:
from django.shortcuts import render

def chat_view(request):
    messages = Message.objects.all()
    return render(request, 'chat/chat.html', {'messages': messages})
  1. 在您的 chat 应用程序的 templates/chat.html 文件中,添加以下内容:
{% extends "base.html" %}

{% block content %}
    <h1>Chat</h1>
    <ul>
        {% for message in messages %}
            <li>{{ message.text }}</li>
        {% endfor %}
    </ul>
    <form action="{% url 'chat' %}" method="post">
        {% csrf_token %}
        <input type="text" name="text">
        <input type="submit" value="Send">
    </form>
{% endblock %}
  1. 在您的 chat 应用程序的 static/chat.js 文件中,添加以下内容:
$(document).ready(function() {
    var socket = new WebSocket("ws://localhost:8000/chat/");

    socket.onopen = function() {
        console.log("WebSocket connection established");
    };

    socket.onmessage = function(event) {
        var data = JSON.parse(event.data);
        var message = data.message;
        var sender = data.sender;
        var receiver = data.receiver;

        if (receiver == '{{ request.user.id }}') {
            var li = $("<li>").text(message);
            $("#chat").append(li);
        }
    };

    socket.onclose = function() {
        console.log("WebSocket connection closed");
    };

    $("#chat-form").submit(function(event) {
        event.preventDefault();

        var text = $("#chat-text").val();
        var sender = '{{ request.user.id }}';
        var receiver = '{{ receiver_user_id }}';

        var data = {
            message: text,
            sender: sender,
            receiver: receiver
        };

        socket.send(JSON.stringify(data));

        $("#chat-text").val("");
    });
});
  1. 在您的 Django 项目的 settings.py 文件中,添加以下内容:
ASGI_APPLICATION = "chat.asgi.application"
  1. 在您的 Django 项目的 asgi.py 文件中,添加以下内容:
import os

from django.core.asgi import get_asgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = get_asgi_application()
  1. 运行以下命令来启动您的 Django 项目:
python manage.py runserver
  1. 访问以下 URL 来打开聊天室:
http://localhost:8000/chat/