Django Тайм-аут конфигурации веб-сокета каналов - PullRequest
0 голосов
/ 01 мая 2020

У меня есть ситуация с моей конфигурацией, в которой я полностью теряюсь из-за того, почему она не работает.

В моем тестовом коде возникла проблема, из-за которой истекает время соединения Websocket:

WebSocket network error: The operation couldn’t be completed. Operation timed out

Что я мог ошибиться в конфигурации для развернутой конфигурации веб-сокета, чтобы не отвечать?

Это мои критические конфигурации:

settings.py

ASGI_APPLICATION = 'tracking.routing.application'

use_websockets = True

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis://:password@127.0.0.1:6379/0")],
        },
    },
}

consumer.py

from django.contrib.auth.models     import User
from channels.generic.websocket     import WebsocketConsumer, AsyncWebsocketConsumer
from channels.consumer              import AsyncConsumer
from channels.db                    import database_sync_to_async

import json, asyncio

class TestConsumer(AsyncWebsocketConsumer):

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

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

        await asyncio.sleep(5)
        await self.send({
            "type": "websocket.close"
        })

. html

<script>
    var loc = window.location

    console.log(loc)

    var path        = '/ws/channels-test/'
    var wsStart     = 'wss://'
    var port        = ':6379'
    var endpoint    = wsStart + loc.host + port + path

    console.log(endpoint)

    var socket      = new WebSocket(endpoint)

    socket.onmessage = function(e){
        console.log("message", e)
    }
    socket.onopen = function(e){
        console.log("open", e)
    }
    socket.onerror = function(e){
        console.log("error", e)
    }
    socket.onclose = function(e){
        console.log("close", e)
    }

</script>

routing.py

from channels.auth                  import AuthMiddlewareStack
from channels.routing               import ProtocolTypeRouter, URLRouter
from channels.security.websocket    import AllowedHostsOriginValidator, OriginValidator

import trackinginterface.routing

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator( #check an allowed domain is being used
        AuthMiddlewareStack(
            URLRouter(
                trackinginterface.routing.websocket_urlpatterns
            )
        )
    )
})

trackinginterface / routing.py

from django.urls    import re_path
from .              import consumers

websocket_urlpatterns = [
    re_path(r'ws/channels-test/', consumers.TestConsumer),
]

apache2.conf

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* wss://127.0.0.1:6379%{REQUEST_URI} [P,QSA,L]
...