Каналы Django - невозможно подписаться на группы
Я пытаюсь отправить consumers.py информацию для отображения на клиентской стороне вне consumers.py.
Я обратился к Send message using Django Channels from outside Consumer class в предыдущем вопросе, но подпроцесс .group_send или .group_add, кажется, не существует, поэтому я чувствую, что, возможно, я упускаю что-то очень простое.
Consumers.py
from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
class WSConsumer(WebsocketConsumer):
def connect(self):
async_to_sync(self.channel_layer.group_add)("appDel", self.channel_name)
self.accept()
self.render()
appAlarm.py
def appFunc(csvUpload):
#csvUpload=pd.read_csv(request.FILES['filename'])
csvFile = pd.DataFrame(csvUpload)
colUsernames = csvFile.usernames
print(colUsernames)
channel_layer = get_channel_layer()
for user in colUsernames:
req = r.get('https://reqres.in/api/users/2')
print(req)
t = req.json()
data = t['data']['email']
print(user + " " + data)
message = user + " " + data
async_to_sync(channel_layer.group_send)(
'appDel',
{'type': 'render', 'message': message}
)
Выдаёт эту ошибку:
async_to_sync(channel_layer.group_send)(
AttributeError: 'NoneType' object has no attribute 'group_send'
и выдаст ту же ошибку для group_add, когда вычистите его больше, чтобы понять, что происходит, но согласно документации ЗДЕСЬ я чувствую, что это должно работать.
Для всех, кто рассматривает этот вопрос в будущем, я не смог использовать redis или даже memurai в Windows OS из-за стоимости. В итоге я использовал события на стороне сервера (SSE), а именно django-eventstream, и пока что это работает отлично, так как мне не нужно, чтобы клиент взаимодействовал с сервером, для приложения чата это бы не подошло.
Eventstream создает конечную точку на /events/, к которой клиент может подключиться и получить потоковый http-ответ.
Отправка данных из externalFunc.py:
send_event('test', 'message', {'text': 'Hello World'})
Слушатель события в HTML-странице:
var es = new ReconnectingEventSource('/events/');
es.addEventListener('message', function (e) {
console.log(e.data);
var source = new EventSource("/events/")
var para = document.createElement("P");
const obj = JSON.parse(event.data)
para.innerText = obj.text;
document.body.appendChild(para)
}, false);
es.addEventListener('stream-reset', function (e) {
}, false);