在Django渲染后运行代码

0 投票
2 回答
1428 浏览
提问于 2025-04-18 16:28

我有一个树莓派摄像头。这就像一个监控摄像头,所以我想先加载前端页面,然后从服务器那边每秒更新20次图像,并且在客户端每20秒刷新一次图像标签。问题是,服务器端的循环是无限的(除非你暂停它),所以页面根本无法渲染。我想先渲染前端,关闭连接,然后再进行后面的操作。我试过用线程,但效果并不如我所想。

from django.shortcuts import render
import camera
import time
from threading import Thread

class Preview(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        camera.module.preview()

class Render(Thread):
    def __init__(self, request):
        Thread.__init__(self)
        self.request = request
    def run(self):
        return render(self.request, "dashboard/home.html")

def home(request):
    preview=Preview(); preview.setName("Previewer");
    render = Render(request); render.setName("Renderer");
    render.start(); render.join();
    time.sleep(1)
    preview.start(); preview.join();

我知道我可以用另一个脚本通过ajax来运行。这是我目前的状态,但我只想执行一次,就像我刚才说的那样。有什么建议吗?

2 个回答

0

这样做是不行的。HTTP就是不支持那样的操作。你的Django视图必须一次返回一个快照。在前端,你需要加一些JavaScript代码,向Django请求新的快照。当然,每秒请求20次太多了。看起来你需要把摄像头的画面直接传输到浏览器,而不是每秒用Django生成20个快照;)

1

更新图片的过程必须是异步进行的,也就是说,它要和你的Django视图分开运行。你的Django视图可以直接返回最新的图片,然后就结束了,或者在需要的时候启动这个异步任务。

通常我们会使用Celery来实现这个功能。

撰写回答