0

We use django (1.7.5) with mod_wsgi under apache2 in redhat server, and try to use watchdog to monitor the files.

It works fine locally using python manager.py runserver command, while the event is not triggerred in wsgi mode when I deploy it into product environment

# wsgi.py
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

LOGGER.debug("Starting to watch for config file changes.")
fw = FileWatcher()
# filewatcher
path = settings.PROJECT_ROOT
filename = 'config.json'
class ConfigHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if not event.is_directory and event.src_path.endswith(filename):
            LOGGER.debug("The config has changed!, Reloading")

class FileWatcher(object):

    _instance = None
    _watching = False

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            LOGGER.debug("Creating new FileWatcher")
            cls._instance = super(FileWatcher, cls).__new__(cls, *args, **kwargs)

            cls.start_watching()

        return cls._instance

    @classmethod
    def start_watching(cls):
        if not cls._watching:
            LOGGER.debug("Starting to monitor the file: %s",
                        os.path.join(path, filename))
            event_handler = ConfigHandler()
            observer = Observer()
            observer.schedule(event_handler, path=path, recursive=False)
            observer.start()

            cls._watching = True
1
  • Could you share your code how you integrated watchdog into django project locally and with wsgi? From the above code, I can't get where your FileWatcher class initialised and works with views.py. Commented Jun 16, 2020 at 10:09

1 Answer 1

0

Found the route cause, the default Observer (inotify.InotifyObserver) doesn't work in old redhat server with old linux kernel

It is stated in http://pythonhosted.org/watchdog/api.html#module-watchdog.observers

inotify.InotifyObserver Linux 2.6.13+   inotify(7) based observer
polling.PollingObserver Any fallback implementation

Therefore I changed it to generic one

    from watchdog.observers.polling import PollingObserver
    # http://pythonhosted.org/watchdog/api.html#module-watchdog.observers
    observer = PollingObserver()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.