В ChatConsumer() отсутствуют 2 обязательных позиционных аргумента: 'receive' и 'send', в чем ошибка?

Я не могу понять, почему я получаю ошибку. Я пробовал разные подходы, но все равно сталкиваюсь с проблемой в consumers.py. В чем проблема, и что я делаю не так?

messaging_users/routing.py

from django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from messaging_users import consumers

websocket_urlpatterns = [
    path('ws/messaging_users/', consumers.ChatConsumer.as_asgi()),
]

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

messaging_users/consumers.py

from channels.generic.websocket import AsyncWebsocketConsumer
import json

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data):
        
        data = json.loads(text_data)
        message = data['message']

        
        await self.send(text_data=json.dumps({
            'message': 'Received message: ' + message
        }))

js:

<script>
const socket = new WebSocket('ws://localhost:8000/ws/messaging_users/');

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

socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('Received message:', data.message);
};

function sendMessage(message) {
    if (socket.readyState === WebSocket.OPEN) {
        // WebSocket is ready to send a message
        socket.send(JSON.stringify({
            'message': message
        }));
    } else {
        console.error('WebSocket is not ready to send a message. Please wait until the connection is established.');
        // You can add code here for retrying message sending or other error handling
    }
}

// Call sendMessage when clicking the send message button
function handleSendMessageButtonClick() {
    const messageText = document.getElementById('id_body').value;
    sendMessage(messageText);
}

</script>

TypeError: ChatConsumer() отсутствуют 2 обязательных позиционных аргумента: 'receive' и 'send'

"GET /ws/messaging_users/ HTTP/1.1" 500 66917

The easiest fix I can see here to try is to do this instead, in routing.py:

websocket_urlpatterns = [
    path('ws/messaging_users/', consumers.ChatConsumer), # without .as_asgi()
]

Not passing the class itself might be what is making your function act unexpectedly

Вернуться на верх