Я изо всех сил пытался найти решение этой проблемы. Мой проект 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)
Проблема в том, что он работает нормально при первой загрузке представления, но когда данные в расположении doc_ref
изменяются из веб-браузера в консоли Firebase, вызывается функция слушателя 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
, может быть, это родительский поток.
Как я могу сообщить основному потоку Django из потока on_snapshot
о повторной визуализации представления? Или мне чего-то не хватает?