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



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

我在Windows上使用django。

我尝试添加.py扩展名,但没有奏效。

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)

姜戈<2.2

Django 将监视的文件路径存储在django.utils.autoreload._cached_filenames列表中,因此在其中添加或删除项目将强制 django 启动或停止监视文件。

至于你的问题,这是(一种黑客)解决方案。出于演示目的,我调整了apps.py,以便在 django 初始化后立即开始监视文件,但可以随意将代码放在您想要的任何位置。首先,创建文件,因为 django 只能监视已经存在的文件:

$ touch /tmp/foo.bar

在你的 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')

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

$ echo baz >> /tmp/foo.bar

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

接受的答案在 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)

最新更新