pip install Django-socketio
django-admin startproject chatroom
cd chatroom
python manage.py startapp chat
python
INSTALLED_APPS = [
...
'chat',
'django_socketio',
...
]
MIDDLEWARE = [
...
'django_socketio.middleware.SocketIOMiddleware',
...
]
python
from django.db import models
class ChatRoom(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
python
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class ChatMessage(models.Model):
room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
message = models.TextField()
timestamp = models.DateTimeField(default=timezone.now)
def __str__(self):
return f'{self.user.username}: {self.message}'
python
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseBadRequest
from django.contrib.auth.decorators import login_required
from django.contrib.sites.shortcuts import get_current_site
from django_socketio import events
from .models import ChatRoom, ChatMessage
@login_required
def chatroom(request, room_id):
room = get_object_or_404(ChatRoom, id=room_id)
messages = ChatMessage.objects.filter(room=room).order_by('timestamp')
return render(request, 'chatroom.html', {'room': room, 'messages': messages})
@events.on_message(channel='^/chat/(?P<room_id>\d+)$')
def message(request, socket, context, message):
room_id = context['room_id']
room = get_object_or_404(ChatRoom, id=room_id)
user = request.user
if not user.is_authenticated:
return HttpResponseBadRequest()
ChatMessage.objects.create(room=room, user=user, message=message)
context['message'] = message
return context
python
from django.urls import path
from . import views
urlpatterns = [
path('chat/<int:room_id>/', views.chatroom, name='chatroom'),
]
python
from django_socketio import views as socketio_views
urlpatterns = [
...
path('django_socketio', socketio_views.serve, name='django_socketio'),
]
python manage.py runserver