[英]Django autoreload: add watched file
当我的项目中的源文件更改时,django 服务器会重新加载。 我想将其扩展到非 Python 源文件。 我使用存储在单独文件(例如big_select.sql
)中的本机 SQL 查询,并且我希望服务器在这些文件更改时重新加载。
我在 Windows 上使用 django。
我尝试添加.py
扩展名,但没有用。
自动重新加载进行了重大改革(感谢@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)
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.