如何使用侦听器或回调函数的更新上下文重新渲染Django中的视图?

时间:2019-07-10 01:32:27

标签: django firebase

我一直在努力寻找解决此问题的方法。我的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主线程重新渲染视图?还是我想念的东西?

1 个答案:

答案 0 :(得分:0)

由于没有请求,因为它已经返回,因此您必须使用ajax或websocket在浏览器中进行更改,django-channels可以帮助解决此问题。