Django自动重载:添加监视的文件

kyr*_*ill 5 python django

当我的项目中的源文件更改时,django服务器将重新加载。我想将此扩展到非Python源文件。我使用本地SQL查询,这些查询存储在单独的文件(例如big_select.sql)中,并且我希望服务器在这些文件更改时重新加载。

我在Windows上使用django。

我尝试添加.py扩展名,但是没有用。

hoe*_*ing 7

的Django> = 2.2

自动重装进行了大修(由于@Glenn通知了此注释中即将发生的更改!),因此不必使用未记录的Django功能并将文件附加到_cached_filenames此后。相反,注册自定义信号侦听器,侦听自动重装开始:

# 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)
Run Code Online (Sandbox Code Playgroud)

Django的<2.2

Django将受监视的文件路径存储在django.utils.autoreload._cached_filenames列表中,因此在其中添加或删除其中的项目将迫使django开始或停止监视文件。

至于您的问题,这是(有点怪异)的解决方案。出于演示目的,我改编了,apps.py以便在django初始化后立即开始查看文件,但可以随时将代码放在您想要的位置。首先,创建文件,因为django只能监视已经存在的文件:

$ touch /tmp/foo.bar
Run Code Online (Sandbox Code Playgroud)

在您的Django应用中:

# 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')
Run Code Online (Sandbox Code Playgroud)

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

$ echo baz >> /tmp/foo.bar
Run Code Online (Sandbox Code Playgroud)

服务器应立即触发自动重装。


Are*_*eeb 7

姜戈 >= 3.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)
Run Code Online (Sandbox Code Playgroud)