Как использовать канал вместо группы при использовании каналов django?
Я пытаюсь использовать проект каналов (http://channels.readthedocs.org/en/latest/index.html) на Джанго.
в то время как в документах есть хороший учебник для создания группового приложения websocket(чат), я не мог найти что-то связанное с простым механизмом нажатия, который будет специфичным для клиента (поэтому не нужно использовать группу)
предположим, я хочу построить агрегатор подачи с различными поставщиками новостей и когда пользователь посещает домашнюю страницу и ждет, пока все каналы будут проанализированы, я хочу отправить ему информационные сообщения о том, какой из них анализируется сервером, пока он ждет.
теперь у меня есть: consumers.py
from channels import Group, Channel
from .views import sort_articles_by_date
from .soup import ProviderParser
from .models import Provider
# Connected to websocket.connect and websocket.keepalive
def ws_add(message):
Group("news_providers_loading").add(message.reply_channel)
def ws_message(message):
providers = Provider.objects.all()
articles = []
for provider in providers:
Group("news_providers_loading").send({'content': str(provider)})
parser = ProviderParser(provider)
articles.extend(parser.parse_articles())
sort_articles_by_date(articles)
# Connected to websocket.disconnect
def ws_disconnect(message):
Group("news_providers_loading").discard(message.reply_channel)
routing.py
channel_routing = {
"websocket.connect": "news_providers.consumers.ws_add",
"websocket.keepalive": "news_providers.consumers.ws_add",
"websocket.receive": "news_providers.consumers.ws_message",
"websocket.disconnect": "news_providers.consumers.ws_disconnect",
}
хотя он работает нормально, я не могу помочь, но чувствую, что немного перебор(?) Есть ли способ просто использовать конструктор канала вместо Group?
спасибо :)
1 ответов
обновление:
версия каналов = 0.9
каналы теперь 0.9, поэтому для получения клиентом сообщения с сервера требуются некоторые изменения:
class Content:
def __init__(self, reply_channel):
self.reply_channel = reply_channel
def send(self, json):
self.reply_channel.send({
'reply_channel': str(self.reply_channel),
'text': dumps(json)
})
def ws_message(message):
content = Content(message.reply_channel)
content.send({'hello': 'world'})
routing.py остается то же самое...
версия каналов
Ба, это было немного сложно, но мы нашли его.
вы должны использовать свойство reply_channel сообщения. Так вот:
Group("news_providers_loading").send({'content': str(provider)})
превращается в это:
Channel(message.reply_channel).send({'content': str(provider)})
теперь у меня есть:
from channels import Channel
from .soup import ProviderParser, sort_articles_by_date
from .models import Provider
from django.template.loader import render_to_string
from json import dumps
class Content:
def __init__(self, reply_channel):
self.reply_channel = reply_channel
def send(self, json):
Channel(self.reply_channel).send({'content': dumps(json)})
def ws_message(message):
providers = Provider.objects.all()
content = Content(message.reply_channel)
content.send({'providers_length': len(providers)})
articles = []
for provider in providers:
content.send({'provider': str(provider)})
parser = ProviderParser(provider)
articles.extend(parser.parse_articles())
sort_articles_by_date(articles)
html = render_to_string('news_providers/article.html', {'articles': articles})
content.send({'html': html})
routing.py
channel_routing = {
"websocket.receive": "news_providers.consumers.ws_message",
}
кажется легче, хотя вы можете захотеть сохранить методы connect, keepalive и disconnect (как простые методы foo)-не совсем уверен в этом -!
# connect, keepalive and disconnect
def ws_foo(message):
pass
routing.py
channel_routing = {
"websocket.connect": "news_providers.consumers.ws_foo",
"websocket.keepalive": "news_providers.consumers.ws_foo",
"websocket.receive": "news_providers.consumers.ws_message",
"websocket.disconnect": "news_providers.consumers.ws_foo",
}