Как использовать канал вместо группы при использовании каналов django?

Я пытаюсь использовать проект каналов (http://channels.readthedocs.org/en/latest/index.html) на django.

Хотя в документах есть хороший учебник по созданию группового веб-приложения (чата), я не смог найти что-то, связанное с простым механизмом push, который будет специфичным для клиента (поэтому нет необходимости использовать группу)

Допустим, я хочу создать агрегатор каналов с различными поставщиками новостей, и когда пользователь посещает домашнюю страницу и ждет, пока все каналы будут проанализированы, я хочу отправить ему информационные сообщения о том, какой из них анализируется сервером, пока он ждет .

Что я получил сейчас: 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)

маршрутизация.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",
}

Хотя это работает нормально, я не могу с этим поделать, но чувствую, что это немного излишне (?) Есть ли способ просто использовать конструктор канала вместо группы?

Спасибо :)


person mitsest    schedule 30.01.2016    source источник


Ответы (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 остается прежним...


версия каналов ‹ 0.9

Бах, было немного сложно, но нашел.

Вы должны использовать свойство answer_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})

маршрутизация.py

channel_routing = {
     "websocket.receive": "news_providers.consumers.ws_message",
}

Кажется легче, хотя вы, возможно, захотите сохранить методы подключения, поддержания активности и отключения (как простые методы foo) - не совсем уверен в этом -!

# connect, keepalive and disconnect
def ws_foo(message):
    pass

маршрутизация.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",
}
person mitsest    schedule 30.01.2016