Django Ошибка канала: нет обработчика для типа сообщения websocket.receive - PullRequest
0 голосов
/ 29 февраля 2020

поток. html

<script>
//console.log(window.location)
var loc = window.location
var formData = $("#form")
var msgInput = $("#message_id")


var wsStart = 'ws://' 
if (loc.protocol == 'https:') {
    wsStart = 'wss://' 
}
var endpoint = wsStart + loc.host + loc.pathname    // EndPoint of the connection

var socket = new WebSocket(endpoint)

socket.onmessage = function(e){
    console.log("message: ", e)}

socket.onopen = function(e){
    console.log("open: ", e)  
    socket.send("Cool guys")   //TRYING TO SEND THIS VIA THE SOCKET

}

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

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

</script>

consumer.py

import asyncio
import json
from django.contrib.auth import get_user_model
from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async

from .models import Thread, ChatMessage

class ChatConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print("Connected", event)
        await self.send({
            "type": "websocket.accept" 
        })

        # other_user = self.scope['url_route']['kwargs']['username']
        # me = self.scope['user']
        # thread_obj = await self.get_thread(me, other_user)
        # print(other_user, me)
        # print(thread_obj)

    async def websocket_recieve(self, event):
        print('Recieve', event)
        await self.send({
            "type": "websocket.send",
            "text": event,

        })
        front_text = event.get('text', None)
        if front_text is not None:
            msg_json_dict = json.loads(front_text)
            msg = msg_json_dict.get('message')
            print(msg)

            await self.send({
                "type": "websocket.send",
                "text": msg,
            })

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

    # @database_sync_to_async
    # def get_thread(self, user, other_user):
    #     return Thread.objects.get_or_new(user, other_user)[0]

ошибка выдана

  File "/home/pentester/.local/lib/python3.7/site-packages/channels/consumer.py", line 75, in dispatch
    raise ValueError("No handler for message type %s" % message["type"])
  No handler for message type websocket.receive
WebSocket DISCONNECT /messages/boy/ [127.0.0.1:37172]

Нет обработчика для типа сообщения websocket сейчас моя головная боль.

Намерение

Я намеревался отправить сообщение через сокет из потока . html в методе socket .onopen , но я всегда получаю сообщение об ошибке, в котором говорится, что повышение ValueError ("Нет обработчика для типа сообщения% s"% message ["type"]

socket urlpattern

from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url, re_path
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator

from chat.consumers import ChatConsumer

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

1 Ответ

0 голосов
/ 03 марта 2020

Я отвечаю здесь, чтобы пойти дальше. Большое спасибо за то, что вы нашли время для добавления шаблонов URL WebSocket, и я считаю, что проблема заключается только в орфографической ошибке.

Измените websocket_recieve на websocket_receive, и он сможет принимать сообщение.

Причина, по которой эти каналы используют функцию _ для преобразования в реальный слой сокетов websocket.receive, поэтому правописание важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...