Python 使用django频道时如何使用频道而不是组?

Python 使用django频道时如何使用频道而不是组?,python,django,asynchronous,push,channels,Python,Django,Asynchronous,Push,Channels,我正在尝试使用django上的channels项目() 虽然在文档中有一个构建基于组的websocket应用程序(chat)的好教程,但我找不到与简单的推送机制相关的特定于客户端的内容(因此不需要使用组) 假设我想用各种新闻提供者构建一个提要聚合器,当用户访问主页并等待所有提要被解析时,我想在他等待时向他发送关于服务器正在解析哪个提要的信息消息 我现在得到的是: 消费者.py from channels import Group, Channel from .views import sort_

我正在尝试使用django上的channels项目()

虽然在文档中有一个构建基于组的websocket应用程序(chat)的好教程,但我找不到与简单的推送机制相关的特定于客户端的内容(因此不需要使用组)

假设我想用各种新闻提供者构建一个提要聚合器,当用户访问主页并等待所有提要被解析时,我想在他等待时向他发送关于服务器正在解析哪个提要的信息消息

我现在得到的是: 消费者.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",
}
channel_routing = {
     "websocket.receive": "news_providers.consumers.ws_message",
}
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",
}
虽然效果不错,但我还是忍不住觉得有点过头了(?) 有没有办法只使用通道构造函数而不是组

谢谢:)

更新: 频道版本=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 呸,这有点棘手,但找到了

您必须使用邮件的回复通道属性。 因此:

变成这样:

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.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",
}
channel_routing = {
     "websocket.receive": "news_providers.consumers.ws_message",
}
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",
}
看起来更轻松,尽管您可能希望保持连接、保持激活和断开连接方法(作为简单的foo方法)-对此不完全确定-

# connect, keepalive and disconnect
def ws_foo(message):
    pass
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",
}
channel_routing = {
     "websocket.receive": "news_providers.consumers.ws_message",
}
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",
}