Self.scope['user'] всегда показывает мне одного и того же пользователя, Django Channels

Я начинающий пользователь Django Channels и пытаюсь сделать приложение для чата. Вроде все работает хорошо, но проблема в том, что сообщение не отправляется обоим пользователям, подключенным к комнате. Я думаю, что проблема внутри consumer.py в user = self.scope['user'], потому что если я печатаю user, то он показывает каждый раз только первого пользователя, который что-то написал. Так что если у меня есть два пользователя: user1 и user2 и если user2 напишет что-то первым, то user = self.scope['user'] всегда будет выдавать мне второго пользователя. Я использую Redis с помощью WSL2.

пример консольного журнала, если один из пользователей отправит что-то:

receive {'type': 'websocket.receive', 'text': '{"message":"abc"}'}
message {'type': 'chat_message', 'text': '{"message": "abc", "username": "test"}'}
message {'type': 'chat_message', 'text': '{"message": "abc", "username": "test"}'}

templates/thread.html

{% extends "base.html" %}

{% block content %}
<h3>Thread for {% if user != object.first %}{{ object.first }}{% else %}{{ object.second }}{% endif %}</h3>
<ul id='chat-items'>
{% for chat in object.chatmessage_set.all %}

<li>{{ chat.message }} via {{ chat.user }}</li>

{% endfor %}
</ul>

<form id='form' method='POST'> {% csrf_token %}
    <input type='hidden' id='myUsername' value='{{ user.username }}'/>
{{form.as_p }}
<input type='submit' class='btn btn-primary'/>
</form>

{% endblock %}

{% block script %}
<script src='https://cdnjs.cloudflare.com/ajax/libs/reconnecting-websocket/1.0.0/reconnecting-websocket.js'></script>
<script>
// websocket scripts
var loc = window.location
var formData = $("#form")
var msgInput = $("#id_message")
var chatHolder = $("#chat-items")
var me = $('#myUsername').val()

var wsStart = 'ws://' 
if(loc.protocol == 'https:') {
    wsStart = 'wss://'
}
var endpoint = wsStart + loc.host + loc.pathname
var socket = new ReconnectingWebSocket(endpoint)

socket.onmessage = function(e) {
    console.log("message", e)
    var chatDataMsg = JSON.parse(e.data)
    chatHolder.append("<li>" + chatDataMsg.message + " via " + chatDataMsg.username + "</li>")
}

socket.onopen = function(e) {
    console.log("open", e)
    formData.submit(function(event){
        event.preventDefault()
        var msgText = msgInput.val()

        var finalData = {
            'message': msgText
        }
        socket.send(JSON.stringify(finalData))
        formData[0].reset()
    })
}

socket.onerror = function(e) {
    console.log("erro", e)
}

socket.onclose = function(e) {
    console.log("close", e)
}

</script>
{% endblock %}

urls.py

app_name = 'chat'
urlpatterns = [
    path("", InboxView.as_view()),
    re_path(r"^(?P<username>[\w.@+-]+)", ThreadView.as_view()),
]

routing.py:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url(r"^messages/(?P<username>[\w.@+-]+)/$", ChatConsumer())
                ]
            )
        )
    )
})

consumer.py:

import json
from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async
from .models import Thread


class ChatConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print("connected", event)

        other_user = self.scope['url_route']['kwargs']['username']
        me = self.scope['user']
        thread_obj = await self.get_thread(me, other_user)
        chat_room = f"thread_{thread_obj.id}"
        self.chat_room = chat_room
        await self.channel_layer.group_add(
            chat_room,
            self.channel_name
        )

        await self.send({
            "type": "websocket.accept"
        })

    async def websocket_receive(self, event):
        print("receive", event)
        front_text = event.get('text', None)
        if front_text is not None:
            loaded_dict_data = json.loads(front_text)
            msg = loaded_dict_data.get('message')

            user = self.scope['user']
            username = 'default'
            if user.is_authenticated:
                username = user.username

            myResponse = {
                'message': msg,
                'username': username
            }

            await self.channel_layer.group_send(
                self.chat_room,
                {
                    "type": "chat_message",
                    "text": json.dumps(myResponse)
                }
            )

    async def chat_message(self, event):
        print('message', event)
        await self.send({
            "type": "websocket.send",
            "text": event['text']
        })

    async def websocket_disconnect(self, event):
        print("disconnected", event)

    @database_sync_to_async
    def get_thread(self, user, other_username):
        return Thread.objects.get_or_new(user, other_username)[0]
Вернуться на верх