python - Django 自动重载 : add watched file

标签 python django

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

我在 Windows 上使用 django。

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

最佳答案

Django>=2.2

对自动重新加载进行了大修(感谢@Glenn,他在 this comment 中通知了传入的更改!),因此不必使用未记录的 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<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

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

关于python - Django 自动重载 : add watched file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907285/

相关文章:

javascript - 201 创建由 django Rest 框架发送的状态代码,通过 jquery $.ajax 调用解释为失败

python - py.test 将 IndexError/KeyError 报告为失败而不是错误

Python 嵌套 'while' 循环未正确执行

python - django 1.9 不为自定义用户模型创建表

python - Django-taggit 向对象添加新标签?

python - 如何使用 Django 将 postgres 表默认 ID 设置为 uuid_generate_v4()

Django 无法加载模板标签

python - 将 JSON 中的变量替换为列表中的项目

python - 如何使用 Python 3.3 实现原始帧捕获?

python - 使用 json 加载在 Python 3.6 中产生 'ascii codec can' t 编码字符错误