我一直在努力寻找解决此问题的方法。我的Django项目使用 Firebase Admin SDK 。一切正常,但我有一个页面视图,其中包含这段代码
def my_view(request):
def on_snapshot(doc_snapshot, changes, read_time):
print('Data changed!')
return render(request, 'xxxxx.html', context)
# 'db' is the Firestore object initialized using firebase admin SDK
doc_ref = db.document(....)
res = doc_ref.get().to_dict()
doc_ref.on_snapshot(on_snapshot)
context = {
'result': res,
.........
.........
}
return render(request, 'xxxxx.html', context)
问题是,当第一次加载视图时,它工作正常,但是当从Firebase控制台中的Web浏览器更改doc_ref
位置中的数据时,将调用侦听器函数on_snapshot
并消息Data changed!
被打印在终端中,但是return render(.....)
从未被触发。
我不知道为什么这行不通,我在网上搜索解决方案,其中许多建议使用 ajax 。如果事件是由用户在前端触发的,那么 ajax 是有用的,但就我而言,事件是由侦听器功能触发的。请帮助我解决这个问题。我想在前端上进行实时更新。但这是行不通的。任何变通办法表示赞赏。
我知道有用于实时更新的 Channels2 软件包,但是对于这个小型应用程序来说,它实在太多了。如果我没有其他选择,必须使用它,请向我展示一种更好的方法。
EDIT-1:
return render(.....)
侦听器函数中的on_snapshot
行替换为return redirect(....)
,但这也不起作用! my_view
线程不同的线程。通过这样做我才知道。
threading
程序包,并使用此行代码threading.currentThread().getName()
打印当前线程名称,Thread-2
内的行打印了my_view
,但为on_snapshot
侦听器函数内的行打印了Thread-ConsumeBidirectionalStream
我不了解Thread-1
,也许它是父线程。
如何告诉on_snapshot
线程中的Django主线程重新渲染视图?还是我想念的东西?
答案 0 :(得分:0)
由于没有请求,因为它已经返回,因此您必须使用ajax或websocket在浏览器中进行更改,django-channels可以帮助解决此问题。