колба с наблюдателем - PullRequest
0 голосов
/ 30 мая 2018

Я ищу пример для веб-приложения на основе колб с наблюдателем.Более конкретно, я хочу использовать сторожевой наблюдатель для обнаружения любых изменений в предопределенных каталогах и обновления веб-приложения на основе этих изменений.Я могу найти много примеров для каждого из них, например, веб-приложения на основе колб и примеры наблюдателей.

Но я не знаю, как объединить два примера и выполнить их гладко.Кто-нибудь может привести простой пример?

Кроме того, мне интересно, могу ли я запустить наблюдателя-сторожа с работником Celery?

Спасибо

РЕДАКТИРОВАТЬ: я использовал работника сельдерея для запускаНаблюдатель-сторожевой таймер следит за каталогом и его подкаталогами следующим образом:

@celery.task(bind=True)
def _watcher(self):
   observer = Observer()
   handler = MyHandler()
   observer.schedule(handler, '.')
   observer.start()
   try:
      while True:
         if not handler.event_q.empty():
            event, ts = handler.event_q.get()
            self.update_state(state='PROGRESS', meta={'src_path': event.src_path, 'event_type': event.event_type})
            time.sleep(1)
  except KeyboardInterrupt:
      observer.stop()
  observer.join()
  return {'src_path': 'srcpath', 'event_type': 'eventtype'}

Затем с внешней стороны он каждую 1 секунду вызывает функцию GET для обновления любых изменений, если они есть.Это немного глупо.

Чего я в конечном итоге хочу добиться, так это 1) продолжать следить за каталогом и его подкаталогами, 2) если есть какие-либо изменения, обновлять базу данных в соответствии с изменениями и 3) обновлять фронтКонечная сторона на основе изменений.

До сих пор я мог обновлять базу данных на основе изменений в файловой системе, используя watchdog (класс MyHandler в приведенном выше коде).Но я все еще ищу лучшее решение для наблюдения за изменениями в рамках фляги и для обновления изменений на стороне интерфейса.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я использовал многопоточность.

from flask import Flask, render_template, jsonify
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

from queue import Queue
import time
import threading

class MyHandler(FileSystemEventHandler):
    def __init__(self, pattern=None):
        self.pattern = pattern or (".xml", ".tiff", ".jpg")
        self.event_q = Queue()
        self.dummyThread = None

    def on_any_event(self, event):
        if not event.is_directory and event.src_path.endswith(self.pattern):
        self.event_q.put((event, time.time()))

    def start(self):
        self.dummyThread = threading.Thread(target=self._process)
        self.dummyThread.daemon = True
        self.dummyThread.start()

    def _process(self):
        while True:
            time.sleep(1)

app = Flask(__name__)
handler = MyHandler()
handler.start()

eventlist_flag = 0
eventlist = []

def run_watcher():
    global eventlist_flag, eventlist

    observer = Observer()
    observer.schedule(handler, '.')
    observer.start()
    try:
        while True:
            if eventlist_flag == 0:
                eventlist_flag = 1
                while not handler.event_q.empty():
                    event, ts = handler.event_q.get()
                    eventlist.append(event)
                eventlist_flag = 0
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

@app.route('/watcher/status', methods=['POST'])
def watchernow():
    global eventlist_flag, eventlist
    if eventlist_flag == 0 and len(eventlist) > 0:
        eventlist_flag = 2
        for e in eventlist:
            print(e)
            eventlist = []
    eventlist_flag = 0
    return jsonify({})

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    watcher_thread = threading.Thread(target=run_watcher)
    watcher_thread.start()
    app.run(debug=True)
    watcher_thread.join()
0 голосов
/ 30 мая 2018

Flask (Werkzeug) уже интегрирует сторожевой таймер для сервера разработки при включении режима отладки.Единственное, что вам нужно сделать, это установить сторожевой таймер:

$ pip install watchdog

Дополнительная информация:

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