当我的项目中的源文件更改时,django服务器将重新加载。我想将此扩展到非Python源文件。我使用本地SQL查询,这些查询存储在单独的文件(例如big_select.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)
Run Code Online (Sandbox Code Playgroud)
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)
服务器应立即触发自动重装。
接受的答案在 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)
| 归档时间: |
|
| 查看次数: |
2631 次 |
| 最近记录: |