Файл new.js, который содержит соединение websocket и который фактически соединяет / активирует каналы django, не соединяется. Я не понимаю, где именно проблема.
Я попытался подключить другое сокетное соединение для другого потребителя на другой HTML-странице, которая работает отлично.
WebSocket HANDSHAKING /new/ [127.0.0.1:61934]
WebSocket CONNECT /new/ [127.0.0.1:61934]
Add specific.bYAxHTPf!sBbGasUiKdHR channel to post's group
connected
Одна веб-розетка прекрасно подключается
где, когда я запускаю localhost:8000/w
который должен подключаться к другому веб-сокету, он не подключается к потребителям.
HTTP GET /static/js/channels/new_web.js 304 [0.01, 127.0.0.1:62085]
Я могу получить доступ к соединению websocket внутри шаблона,
но этот websocket запускает мой путь в маршрутизации, который, в свою очередь, запускает моих потребителей.
new_web.js
$(function(){
endpoint = 'ws://127.0.0.1:8000/like/' // 1
var socket = new ReconnectingWebSocket(endpoint) // 2
socket.onopen = function(e){
console.log("open",e);
}
socket.onmessage = function(e){
console.log("message",e)
var userData = JSON.parse(e.data)
$('#new_user').html(userData.html_users)
}
socket.onerror = function(e){
console.log("error",e)
}
socket.onclose = function(e){
console.log("close",e)
}
});
socket.onclose = function(e){
console.log("close",e)
}
});
routing.py
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.urls import path
from posts.consumers import PostConsumer,LikeConsumer
application = ProtocolTypeRouter({
'websocket': AuthMiddlewareStack(
URLRouter(
[
path("new/", PostConsumer),
path("like/", LikeConsumer),
]
)
)
})
consumers.py
class LikeConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
self.user = self.scope["user"]
if user.is_anonymous:
await self.close()
print("user is anonymous")
else:
await self.accept()
user_group = await self._get_user_group(self.scope['user'])
await self.channel_layer.group_add("{}".format(user.id), self.channel_name)
print(f"Add {self.channel_name} channel to post's group")
print('connected')
@database_sync_to_async
def _get_user_group(self, user):
if not user.is_authenticated:
raise Exception('User is not authenticated.')
return user.groups.first().name
async def disconnect(self,close_code):
await self.channel_layer.group_discard("{}".format(user.id), self.channel_name)
print(f"Remove {self.channel_name} channel from post's group")
Даже если с потребительской частью что-то не так, все равно должна быть какая-то ошибка, но я просто не могу найти ни ошибки в консоли, ни в терминале.
Я просто хочу вызвать этого потребителя. В потребительской части я пытаюсь добавить конкретного пользователя к определенному каналу и группе. Я не уверен, что это правильный способ сделать это.
Если я сделал что-то не так, пожалуйста, дайте мне знать.