繁体   English   中英

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

[英]Django autoreload: add watched file

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

我在 Windows 上使用 django。

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

姜戈>=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 开始或停止监视文件。

至于你的问题,这是(一种hacky)解决方案。 出于演示目的,我修改了apps.py以便在 django 初始化后立即开始apps.py文件,但您可以随意将代码放在任何您想要的位置。 首先,创建文件,因为 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM