【发布时间】:2018-07-29 01:17:15
【问题描述】:
我完全陷入了无法让群组消息与频道 2 一起使用的问题!我已经按照我能找到的所有教程和文档进行操作,但可惜我还没有找到问题所在。我现在要做的是拥有一个特定的 URL,当访问该 URL 时,它应该向名为“events”的组广播一条简单的消息。
首先,这是我在 Django 中使用的相关和当前设置:
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
'hosts': [('localhost', 6379)],
},
}
}
ASGI_APPLICATION = 'backend.routing.application'
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'channels',
'channels_redis',
'backend.api'
]
接下来,这是我的 EventConsumer,以非常基本的方式扩展了 JsonWebsocketConsumer。所有这一切都是在收到消息时回显,这是有效的!因此,简单的 send_json 响应按原样到达,只有组广播不起作用。
class EventConsumer(JsonWebsocketConsumer):
groups = ["events"]
def connect(self):
self.accept()
def disconnect(self, close_code):
print("Closed websocket with code: ", close_code)
self.close()
def receive_json(self, content, **kwargs):
print("Received event: {}\nFrom: {}\nGroups:
{}".format(content,
self.channel_layer,
self.groups))
self.send_json(content)
def event_notification(self, event):
self.send_json(
{
'type': 'test',
'content': event
}
)
这是我要触发广播的 URL 的 URL 配置:
项目 urls.py
from backend.events import urls as event_urls
urlpatterns = [
url(r'^events/', include(event_urls))
]
事件应用程序 urls.py
from backend.events.views import alarm
urlpatterns = [
url(r'alarm', alarm)
]
最后,应该发生群组广播的视图本身:
from django.shortcuts import HttpResponse
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def alarm(req):
layer = get_channel_layer()
async_to_sync(layer.group_send)('events', {'type': 'test'})
return HttpResponse('<p>Done</p>')
【问题讨论】:
标签: django redis django-channels