在Django渲染后运行代码
我有一个树莓派摄像头。这就像一个监控摄像头,所以我想先加载前端页面,然后从服务器那边每秒更新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来实现这个功能。