У меня есть ситуация с моей конфигурацией, в которой я полностью теряюсь из-за того, почему она не работает.
В моем тестовом коде возникла проблема, из-за которой истекает время соединения 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]