watchdog в flask не отслеживает изменения при запуске на uwsgi / gunicorn - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть приложение flask, которое отслеживает изменения файла журнала и после каждого изменения записывает его в базу данных.

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

from datetime import datetime as dt
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

from application.models import db, RecordDB, LogDB
from application.parser import get_last_n_records, parse_record
from application import create_app

app = create_app()

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.event_type == "modified" and event.src_path == "/var/log/icecast/song-history.log":
            title, artist, album, started_at = parse_record(get_last_n_records(n=1))
            with app.app_context():
                try:                
                    record = RecordDB(title=title,
                                    artist=artist,
                                    album=album,
                                    started_at=started_at,
                                    added_at=dt.now())
                    db.session.add(record)
                    db.session.commit()
                except Exception as e:
                    print(e)
        elif event.event_type == "modified" and event.src_path == "/var/log/icecast/access.log":
            with app.app_context():
                try:                
                    record = LogDB(message=get_last_n_records(n=1),                                    
                                    time=dt.now())
                    db.session.add(record)
                    db.session.commit()
                except Exception as e:
                    print(e)


def notify():
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='/var/log/icecast', recursive=False)
    observer.start()

и вот мой файл run.py в качестве точки входа

import threading
from application.notifier import app, notify 

def main():
    notify_thread = threading.Thread(target=notify)
    notify_thread.start()
    app.run(host='localhost', port='5000')
    notify_thread.join()


if __name__ == "__main__":
    main()

Когда я запускаю его на dev с python run.py, он работает нормально, и база данных обновляется каждый раз, когда происходит изменение. когда я запускаю его с uwsgi --http-socket :5000 --plugin python3 --module run:app --processes 2 --enable-threads --threads 4, событие файловой системы никогда не происходит, поэтому ввод в db не происходит.

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

...