如何使用Django Streaming HTTPS Response正确渲染图像?

时间:2016-01-11 13:03:30

标签: python django opencv

我在Python中编写了一些代码,利用OpenCV(以及其他软件包)逐帧浏览选定的视频,检查框架是否有人(参见here),以及然后返回找到一个人的所有帧。

目标(目前)是在Web浏览器中动态显示这些图像。我用这个答案作为指导:How to stream an HttpResponse with Django

我的代码如下:

def stream_response(request):
    return StreamingHttpResponse(detect())

def detect():
    frame_count=0
    while(frame_count < num_frames):
        ret, frame = capture.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        image_pil=Image.fromarray(gray)
        response = HttpResponse(content_type="image/jpeg")
        image_pil.save(response, "JPEG")
        yield response
        yield ""*1024
        time.sleep(1)
        frame_count+=1

然而,当我在Django中使用StreamingHTTPResponse功能来产生响应(实现generator的方法)时,我在浏览器中看到的响应是乱码(见下图) )。 enter image description here

但是,当我使用HTTPResponse 返回响应时,当定向到相应的端口时,图像在浏览器中显示正常。

我已尝试过各种测试,但仍然无法弄清楚。我的理论是,可能是由于浏览器无法在给定时间内渲染图像,但我不确定......

更新:直接从Python中为原型应用程序生成HTML。这就是当前目的的诀窍,但会重新探讨这一点。

1 个答案:

答案 0 :(得分:2)

您需要像Celery这样的分布式任务队列系统。您可以按照

的方式进行申请

您的主页(执行流程从哪里开始)

  1. 要求用户上传视频

  2. 将此视频文件保存在服务器上

  3. 在数据库中添加针对视频的条目

  4. 使用视频记录的ID调用您的detect异步任务,并根据视频保存数据库中返回的任务的ID 记录
  5. 将您的用户重定向到包含视频ID的成功页面
  6. 在成功页面上

    1. 显示成功消息
    2. 使用javascript调用带有视频ID的状态网络服务,并相应地反复更新页面(动态加载图片),直到您收到状态为止。
    3. 在状态网络服务中

      1. 使用视频ID

      2. 获取任务ID
      3. 检查任务状态

      4. 使用视频ID(异步任务在后台放入数据库的图像)从数据库中获取图像

      5. 返回状态(已完成或正在进行)和图像列表