【发布时间】:2020-10-29 15:58:18
【问题描述】:
我没有使用这个 Django 频道进行聊天,我通过网络套接字通过 DRF AUTH 令牌连接用户
var ws = new WebSocket("ws://127.0.0.1:8008/ws/stream/<token>/")
我想实现如果管理员从后端删除用户,那么在移动前端我会得到用户被删除的自动响应,然后我会调用断开连接方法,这将注销前端的用户,如下所示我正在使用的代码。但无法从消费者外部发送消息。 下面是我的代码:-
class Consumer(AsyncJsonWebsocketConsumer):
"""
This chat consumer handles websocket connections for chat clients.
It uses AsyncJsonWebsocketConsumer, which means all the handling functions
must be async functions, and any sync work (like ORM access) has to be
behind database_sync_to_async or sync_to_async. For more, read
http://channels.readthedocs.io/en/latest/topics/consumers.html
"""
##### WebSocket event handlers
async def connect(self):
"""
Called when the websocket is handshaking as part of initial connection.
"""
# query_string = dict(self.scope).get('query_string')
# keys = dict(parse.parse_qs(query_string.decode()))
self.token_key = self.scope['url_route']['kwargs']['token']
try:
if self.token_key:
# access_token = keys.get('key')
print(self.token_key)
self.scope['user'] = await get_user(self.token_key)
# self.chat_room = self.scope['url_route']['kwargs']['channel']
await self.accept()
await self.send_json({'code':200, 'message': 'Connection establish successfully', 'error_message': '', 'data':{}})
except Exception as ex:
print("Exception", ex)
self.scope['user'] = AnonymousUser()
await self.close()
async def receive_json(self, content):
"""
Called when we get a text frame. Channels will JSON-decode the payload
for us and pass it as the first argument.
"""
# Messages will have a "command" key we can switch on
try:
print("this is the content",content)
command = content.get("command", None)
# Under construction
except ClientError as e:
# Catch any errors and send it back
await self.send_json({"error": e.code})
async def user_delete(self):
await self.send_json({'code':400, 'message': 'User deleted', 'error_message': '', 'data':{}})
async def disconnect(self, code):
"""
Called when the WebSocket closes for any reason.
"""
# Leave all the rooms we are still in
await self.close()
及以下django模型的代码(执行删除操作时使用信号调用)
from channels.layers import get_channel_layer
class Profile(models.Model):
......
......
@receiver(post_delete, sender=Profile)
def s3_delete(sender, instance, using, **kwargs):
try:
channel_layer = get_channel_layer()
?????
channel_layer.send_json({'user deleted'}) #Solution which i am trying to apply
except Exception as ex:
msg = str(ex)
print(msg)
注意:我使用的参考: Send message using Django Channels from outside Consumer class
【问题讨论】:
标签: python django flask websocket django-channels