3 votes

application flask avec observateur watchdog

Je suis à la recherche d'un exemple d'application web basée sur Flask avec un observateur Watchdog. Plus précisément, je veux utiliser l'observateur watchdog pour détecter tout changement dans des répertoires prédéfinis et mettre à jour une application web en fonction de ces changements. Je peux trouver de nombreux exemples pour chacun d'entre eux, c'est-à-dire des exemples d'applications web basées sur flask et d'observateur watchdog.

Mais, je ne sais pas comment intégrer deux exemples et les faire fonctionner sans problème. Quelqu'un peut-il me fournir un exemple simple ?

En outre, je me demande si je peux exécuter l'observateur de chien de garde avec Celery worker ?

Merci

EDIT : J'ai utilisé un celery worker pour exécuter l'observateur watchdog afin de surveiller un répertoire et ses sous-répertoires comme suit :

@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'}

Ensuite, du côté du front-end, toutes les 1 seconde, il appelle la fonction GET pour mettre à jour les changements, s'il y en a. C'est un peu compliqué.

Ce que je veux réaliser, c'est 1) surveiller un répertoire et ses sous-répertoires, 2) s'il y a des changements, mettre à jour une base de données en fonction des changements et 3) mettre à jour le côté frontal en fonction des changements.

Jusqu'à présent, je pouvais mettre à jour une base de données en fonction des changements dans le système de fichiers en utilisant le chien de garde (classe MyHandler dans le code ci-dessus). Mais, je suis toujours à la recherche d'une meilleure solution pour observer les changements dans un cadre flask et de mettre à jour les changements dans le côté front-end.

4voto

Grey Li Points 2726

Flask (Werkzeug) intègre déjà un chien de garde pour le serveur de développement lorsque le mode débogage est activé. La seule chose que vous devez faire est d'installer watchdog :

$ pip install watchdog

Plus d'informations :

1voto

Sungsoo Ha Points 115

J'ai fini par utiliser le multithreading.

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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X