Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用django和kombu的流式视图_Django_View_Generator_Yield_Kombu - Fatal编程技术网

使用django和kombu的流式视图

使用django和kombu的流式视图,django,view,generator,yield,kombu,Django,View,Generator,Yield,Kombu,我在kombu排了两个队;一个提交做某事的请求,另一个通过pub/sub发布所述请求的增量状态。因此,在我的过程中,它将发布到请求队列并在响应队列上使用。由于任务可能需要一些时间,我想向用户提供关于后端发生了什么的反馈;这一切都在命令行上运行,因为我的kombu consume回调允许我添加logging.info语句,以便向我的用户吐回信息: def callback( msg, env ): logging.info( str(msg) ) consumer.register_ca

我在kombu排了两个队;一个提交做某事的请求,另一个通过pub/sub发布所述请求的增量状态。因此,在我的过程中,它将发布到请求队列并在响应队列上使用。由于任务可能需要一些时间,我想向用户提供关于后端发生了什么的反馈;这一切都在命令行上运行,因为我的kombu consume回调允许我添加logging.info语句,以便向我的用户吐回信息:

def callback( msg, env ):
    logging.info( str(msg) )

consumer.register_callback( callback )
consumer.consume()
while continue_consuming:
    connection.drain_events()
但是,我现在希望能够在django中提供相同的功能。我知道我可以创建一个生成器函数作为HttpResponse对象的输入:

但我无法概念化如何将kombu队列的消息回调实现到生成器中,以提供此。。。有什么想法吗


如果可能的话,我希望避免使用数据库层来存储进度/结果。

最后,我决定稍微重新构造代码;由于我在kombu队列周围有一个包装器,使接口更像多进程队列,所以我为get方法创建了一个生成器

这似乎工作得很好,但不是很干净,因为我需要知道self.end_marker或util是什么,并且可能希望遍历所有消费者队列,但我的类是queue per object,所以这并不太糟糕

在我看来,我所做的就是:

 def view( response ):
     q = Queue()
     return HttpResponse( q.get() )
有很多关于各种中间件阻碍的帖子;我只是不想麻烦使用它们,而且它似乎工作得很好

def get( self, until=None ):
    if until == None:
        until = self.end_marker
    for c in count():
        m = self.consumer.queues[0].get( True )
        if not m == None:
            if m.payload == until:
                raise StopIteration
            yield m.payload
 def view( response ):
     q = Queue()
     return HttpResponse( q.get() )