我想创建一个类似于 Facebook 聊天的聊天室。我的想法是创建一个简单的 Chat 应用程序,然后使用 AJAX 轮询(每 2-3 秒发送一次请求)来实现聊天功能。我想知道这种方法是否可行。
2、解决方案
我建议使用一种由服务器控制的推送/实时消息传递的方式。这样,您可以获得真正的实时聊天功能,并且它将具有更好的可扩展性。您可以参考 www.orbited.org/,我认为这是一个不错的… Django 的核心功能,但它是 Python,并且可以很好地与 Django 应用程序一起在您的服务器上运行。
以下是一些使用 AJAX 轮询实现聊天功能的步骤:
- 在您的 Django 项目中创建一个新的应用程序,名为 "chat"。
- 在 chat 应用程序中创建一个新的模型,名为 "Message"。
- 在 chat 应用程序中创建一个新的视图,名为 "chat_view"。
- 在 chat 应用程序中创建一个新的模板,名为 "chat.html"。
- 在 JavaScript 中创建一个新的文件,名为 "chat.js"。
- 在您的 Django 项目的 settings.py 文件中,添加以下内容:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'chat',
]
- 在您的 Django 项目的 urls.py 文件中,添加以下内容:
from django.conf.urls import url
from chat import views
urlpatterns = [
url(r'^chat/$', views.chat_view, name='chat'),
]
- 在您的 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
- 在您的 chat 应用程序的 views.py 文件中,添加以下内容:
from django.shortcuts import render
def chat_view(request):
messages = Message.objects.all()
return render(request, 'chat/chat.html', {'messages': messages})
- 在您的 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 %}
- 在您的 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("");
});
});
- 在您的 Django 项目的 settings.py 文件中,添加以下内容:
ASGI_APPLICATION = "chat.asgi.application"
- 在您的 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()
- 运行以下命令来启动您的 Django 项目:
python manage.py runserver
- 访问以下 URL 来打开聊天室:
http://localhost:8000/chat/