我有使用 websocket 实现的 django (1.9) 应用程序。为了实现 websocket,我使用了 Django 通道(1.1.8)。我的模型在 ACL 下,由 Django-guardian (1.4.4) 管理。
每次创建、更改或删除名为“My_model”的模型时,我都会通过 websocket 发送消息。但我的挑战是模型在 ACL 下,这意味着当且仅当该用户可以查看模型实例时,用户才能通过 websocket 接收消息。这意味着我必须在我的信号处理程序中有用户实例,以便在发送消息之前验证 websocket 用户是否具有 perm。
你可以在下面看到我的实现。它适用于开发环境,但不适用于生产环境。不同之处在于,在生产环境中,websocket 处理程序在 Django 工作人员和 Daphne 服务器下运行。
在文件 my_app/consumers/my_model_consumer.py 中:
class MyModelConsumer(WebsocketConsumer):
http_user_and_session = True
# the connect method is triggered when an user is connecting through the websocket
# It register signals handlers which receive the connected user as argument
def connect(self, message, **kwargs):
user = message.user
group = "my_model_Notifications-{}".format(user.id)
Group(group).add(message.reply_channel)
post_save.connect(partial(notify_my_model_change, user=user, group=group), My_model, weak=False, dispatch_uid= uuid.uuid4())
post_delete.connect(partial(notify_request_delete, user=user, group=group), My_model, weak=False, dispatch_uid= uuid.uuid4())
self.message.reply_channel.send({"accept": True})
def notify_my_model_change(sender, **kwargs):
user = kwargs['user']
instance = kwargs['instance']
if user.has_perm('view_my_model', instance):
Group(group).send({"text": "My_model changed"})
有人知道是什么问题导致它无法在生产环境中工作吗?