[英]Django channels : why is channel_layer.gruop_send getting skipped?
[英]Django Channels - self.channel_layer.group_send not calling function
我正在創建一個具有聊天/投票功能的游戲。 我已經在基於 Django Web 框架的 oTree 中實現了它。 聊天是用 Django 頻道制作的,在每場比賽中,一個人都有與其他玩家的網絡,需要投票/回答問題。
我在我的消費者中定義了一個“send_choice”function,但是當我引用它作為它永遠不會被實例化的類型時。
路由.py
from . import consumers
from django.conf.urls import re_path
websocket_routes = [
re_path(r'ws/chat/(?P<group_pk>[0-9]+)$', consumers.ChatConsumer),
re_path(r'ws/network_voting/(?P<player_pk>[0-9]+)/(?P<group_pk>[0-9]+)$', consumers.NetworkVoting)
]
消費者.py
class NetworkVoting(AsyncJsonWebsocketConsumer):
def clean_kwargs(self):
self.player_pk = self.scope['url_route']['kwargs']['player_pk']
self.group_pk = self.scope['url_route']['kwargs']['group_pk']
async def connect(self):
self.clean_kwargs()
# Join
await self.channel_layer.group_add(
self.connection_groups(),
self.channel_name
)
await self.accept()
print("Connected to Network Socket")
async def disconnect(self, close_code):
self.clean_kwargs()
await self.channel_layer.group_discard(
self.connection_groups(),
self.channel_name
)
print("Disconnected from Network Socket")
def connection_groups(self, **kwargs):
group_name = self.get_group().get_channel_group_name()
personal_channel = self.get_player().get_personal_channel_name()
return "{}-{}".format(group_name, personal_channel)
def get_player(self):
return Player.objects.get(pk=self.player_pk)
def get_group(self):
return Group.objects.get(pk=self.group_pk)
async def receive(self, text_data):
self.clean_kwargs()
text_data_json = json.loads(text_data)
msg = text_data_json['message']
await self.channel_layer.group_send(
"network_voting",
{
"type": "send_choice",
"message": "Hello"
}
)
async def send_choice(self, event):
message = event['message']
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message
}))
print("Sent message")
要在通過組發送消息時被通道調用,您需要訂閱該組。
由於您發送到network_voting
,您需要訂閱它。
await self.channel_layer.group_add("network_voting", self.channel_name)
當您斷開連接時,您還需要取消訂閱。
如果您的組名稱是 static,Channels 提供了一種簡單的方法來執行此操作,您可以在實例上設置屬性groups
。
class NetworkVoting(AsyncJsonWebsocketConsumer):
groups = ['network_voting']
然后,頻道將為您處理訂閱和取消訂閱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.