Django autoreload:添加监视文件

时间:2017-03-20 15:14:37

标签: python django

当我的项目中的源文件发生变化时,django服务器会重新加载。我想在非python源文件上扩展它。我使用本机SQL查询,这些查询存储在SQL文件中(例如big_select.sql),我希望服务器在这些文件发生变化时重新加载。

我在Windows上使用django。

我尝试添加.py扩展程序,但无效。

2 个答案:

答案 0 :(得分:3)

的Django> = 2.2

对自动加载进行了重大改革(感谢@Glenn通知了this comment中的传入更改!),因此不必使用未记录的Django功能并将文件附加到{{ 1}}了。相反,注册自定义信号监听器,听取自动加载开始:

_cached_filenames

的Django< 2.2

Django将监视的文件路径存储在# apps.py from django.apps import AppConfig from django.utils.autoreload import autoreload_started def my_watchdog(sender, **kwargs): sender.watch_file('/tmp/foo.bar') # to listen to multiple files, use watch_dir, e.g. # sender.watch_dir('/tmp/', '*.bar') class EggsConfig(AppConfig): name = 'eggs' def ready(self): autoreload_started.connect(my_watchdog) 列表中,因此添加或删除项目会强制django开始或停止观看文件。

至于你的问题,这是(一种hacky)解决方案。出于演示的目的,我调整了django.utils.autoreload._cached_filenames,以便在django初始化之后立即开始监视文件,但随时可以将代码放在任何地方。首先,创建文件,因为django只能监视已存在的文件:

apps.py

在您的django应用中:

$ touch /tmp/foo.bar

现在启动服务器,在另一个控制台中修改监视文件:

# apps.py
from django.apps import AppConfig
...
import django.utils.autoreload


class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        ...
        django.utils.autoreload._cached_filenames.append('/tmp/foo.bar')

服务器现在应该触发自动重载。

答案 1 :(得分:0)

接受的答案在 Django 3.0.7 中不起作用,可能是因为此后的更改。 经过autoreload后得出以下结论:

from django.utils.autoreload import autoreload_started

# Watch .conf files
def watch_extra_files(sender, *args, **kwargs):
    watch = sender.extra_files.add
    # List of file paths to watch
    watch_list = [
        FILE1,
        FILE2,
        FILE3,
        FILE4,
    ]
    for file in watch_list:
        if os.path.exists(file): # personal use case
            watch(Path(file))


autoreload_started.connect(watch_extra_files)