watchdog观察器在flask中的应用
我正在寻找一个带有watchdog observer的基于flask的web应用程序示例。更具体地说,我想使用watchdog observer来检测预定义目录中的任何更改,并根据这些更改更新web应用程序。我可以找到每一个示例,即基于flask的web应用程序和watchdog observer示例 但是,我不知道如何整合两个示例并顺利运行它们。有人能举个简单的例子吗 另外,我想知道我是否能和芹菜工人一起运行“看门狗观察者” 谢谢 编辑: 我使用芹菜工人运行watchdog observer来监视目录及其子目录,如下所示:watchdog观察器在flask中的应用,flask,celery,python-watchdog,Flask,Celery,Python Watchdog,我正在寻找一个带有watchdog observer的基于flask的web应用程序示例。更具体地说,我想使用watchdog observer来检测预定义目录中的任何更改,并根据这些更改更新web应用程序。我可以找到每一个示例,即基于flask的web应用程序和watchdog observer示例 但是,我不知道如何整合两个示例并顺利运行它们。有人能举个简单的例子吗 另外,我想知道我是否能和芹菜工人一起运行“看门狗观察者” 谢谢 编辑: 我使用芹菜工人运行watchdog observer来
@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类)根据文件系统中的更改更新数据库。但是,我仍然在寻找更好的解决方案,以便在烧瓶框架内观察变化,并更新前端的变化 当启用调试模式时,Flask(Werkzeug)已经为开发服务器集成了看门狗。您只需安装watchdog:
$ pip install watchdog
更多信息:
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()
我希望在我用手实现类似的东西之前就了解到这一点,谢谢你的帮助。谢谢你的回复。我的意思是,我希望监视生产服务器中的文件系统,以便在文件系统(即特定目录及其子目录)中有任何更改时,根据更改更新数据库,并使用更改更新前端。