Django通道失败:WebSocket握手期间出错:net :: ERR_CONNECTION_RESET

时间:2020-01-01 12:30:53

标签: javascript python django websocket django-channels

我陷在此错误中,我试图更改许多问题以进行修复,但仍然出现错误:

(索引):42到'ws://127.0.0.1:8000 / ws / chat / user2 /'的WebSocket连接失败:WebSocket握手期间出错:net :: ERR_CONNECTION_RESET

>

以下是我的代码:

客户端:

var roomName = {{ room_name_json }};
    var formdata=$("#form");
    var input_val=$("#id_messages");
    var chatHolder=$("#chat-items");
    loc=window.location;  // get the addresses
    console.log(window.location);

    var chatSocket = new WebSocket("ws://" +'127.0.0.1:8000' +
        '/ws/chat/' + roomName + '/');
    console.log(chatSocket);


    // client side receives the message
    chatSocket.onmessage = function(e) {
     console.log("message",e)
    };

    chatSocket.onclose = function(e) {
        console.error('Chat socket closed unexpectedly');
    };

    chatSocket.onopen = function(e){
        console.log("open",e);
        formdata.submit(function (event) {
            event.preventDefault();
            var msgText=input_val.val();
            var finalData={
                'message':msgText
            };
            chatSocket.send(JSON.stringify(finalData));
            formdata[0].reset()
        })
    };

    chatSocket.onmessage=function(e){
        var chatdata=JSON.parse(e.data);

      chatHolder.append("<li>"+chatdata.message+ " via "+ chatdata.username +"</li>")
    };


    chatSocket.onerror= function(e){
        console.log("error",e)
    };

Consumer.py

 def __init__(self, scope):
        super().__init__(scope)
        self.chat_room=""

    async def websocket_connect(self,event):
        me=await self.get_user("user")
        other_user="user2" # let pass static value for now for user 2
        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(
            self.chat_room,
            self.channel_name
        )
        await self.send({
            "type": "websocket.accept"
        })
        print(thread_obj)
        #await asyncio.sleep(10)

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

    async def websocket_receive(self, event):
        front_text=event.get('text',None)

        if front_text is not None:
            load_dict_data=json.loads(front_text)
            msg=load_dict_data.get('message')
            user=self.scope['user']
            username="default"

            if user.is_authenticated:
                username=user.username

            myResponse = {
                'message': msg,
                'username': username
            }
            # broadcast the message
            await self.channel_layer.group_send(
                self.chat_room,
                {
                    "type": "chat_message",
                    "text":json.dumps(myResponse)

                }
            )

# message to be sent
    async def chat_message(self,event):
        await self.send({
            "type": "websocket.send",
            "text": event['text']

        })

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

    @database_sync_to_async
    def get_user(self,username):
        Muser=User.objects.get(username=username)
        return Muser

Settings.py:

ASGI_APPLICATION = "Frames.routing.application"
CHANNEL_LAYERS={
    "default":{
      "BACKEND": "channels_redis.core.RedisChannelLayer",
      "CONFIG": {
                "hosts": [("localhost", 6379)],
            },
    },
}

routing.py

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AuthMiddlewareStack(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),
})

发送请求的套接字URL正确,但是连接始终失败。如何解决此问题,是否存在某种redis问题?

2 个答案:

答案 0 :(得分:2)

我有一个类似的问题,事实证明这是由于Django和Redis之间的连接不良所致。尝试对通道层使用其他内容。

#include <set>
#include <functional>
#include <iostream>

// structs
struct my_struct
{
    int a;
    int b;
};

struct my_second_struct
{
    int a;
    int b;
};

bool operator<(const my_second_struct& m1, const my_second_struct& m2)
{
    return m1.b < m2.b;
}

// alias helper
template <typename T>
using custom_comparator_t = std::function<bool(const T, const T)>;

// function to proxy already defined operator to pointers
template<typename T>
auto get_pointer_less()
{
    return [](const T* v1, const T* v2) -> bool { return (*v1) < (*v2); };
}

// this is generic solution
template<typename T>
using pointer_set = std::set<T*, custom_comparator_t<T*>>;

// and final config
template<typename T>
auto get_pointer_set()
{
    return pointer_set<T>( get_pointer_less<T>() );
}

template<typename T, typename _T>
void fill_and_display(_T& s)
{
    s.insert(new T{10, 20});
    s.insert(new T{20, 10});
    s.insert(new T{0, 100});
    s.insert(new T{100, 0});

    std::cout << "set: ";
    for (const T *ms : s)
        std::cout << "( " << ms->a << " ; " << ms->b << " )";
    std::cout << std::endl;
}

int main()
{
    // First option, create custom less operator inline
    std::set<my_struct *, custom_comparator_t<my_struct *>> myset(
        [](const my_struct *ms1, const my_struct *ms2) { return ms1->a < ms2->a; }
    );

    fill_and_display<my_struct>(myset);

    // Second option, reuse, already defined less operator
    std::set<my_second_struct *, custom_comparator_t<my_second_struct*>> my_second_set(
        get_pointer_less<my_second_struct>()
    );

    fill_and_display<my_second_struct>(my_second_set);

    // generic colution for second set
    auto my_third_set = get_pointer_set<my_second_struct>();

    fill_and_display<my_second_struct>(my_third_set);

    return 0;
}

来源:https://channels.readthedocs.io/en/latest/topics/channel_layers.html?highlight=channels.layers.InMemoryChannelLayer#in-memory-channel-layer

警告:不用于生产。

如果此问题得以解决,您至少会知道您的问题与redis连接有关。

(编辑):尝试将Redis升级到v5

答案 1 :(得分:1)

CHANNEL_LAYERS = {
'default': {
    'BACKEND': 'channels.layers.InMemoryChannelLayer',
},
'CONFIG': {
        "hosts": [('redis',6379)],
    },

}

要存储它,它对我有效

相关问题