Как повторно отобразить представление в Django с обновленным контекстом из функции слушателя или функции обратного вызова? - PullRequest
0 голосов
/ 10 июля 2019

Я изо всех сил пытался найти решение этой проблемы. Мой проект 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 о повторной визуализации представления? Или мне чего-то не хватает?

1 Ответ

0 голосов
/ 10 июля 2019

Поскольку нет запроса, так как он уже вернулся, вы должны использовать ajax или websockets для получения изменений в браузере, django-channel может помочь в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...