某些文件发生更改时重新加载Django dev服务器

时间:2015-09-19 20:43:48

标签: python django

是否可以告诉Django开发服务器监听某些文件的更改(不是项目中的常规Python文件,它们已经创建了重新加载)并在这些文件发生更改时重新加载?

我为什么要这样?当我的gulp脚本构建JS和CSS时,它会获取所有文件并向它们添加一个哈希值。我的工作文件 frontend / css / abc.css 将构建到 build / css / abc-hash123.css 。这样,如果自上次部署以来发生了任何变化,浏览器将被迫重新加载内容。构建时,会创建一个包含映射的清单文件。在Django的设置中,我在开始时读取这个清单文件并获取所有这些映射(from this example here)。如果我更改了一个文件,它会获得一个新的哈希值,并写入一个新的清单。当前加载到然后内存是错误的,因此我需要强制重新加载开发服务器以获取新的映射。

澄清:我收到了有关使用VCS的评论。所以只是为了澄清:我使用VCS并检查我的 abc.css abc-hash123.css 会自动构建为构建系统的一部分。

2 个答案:

答案 0 :(得分:0)

doc而言,这不受支持。

这有点hacky,但只是touch(或以任何其他方式更改时间戳)某些.py文件或开发服务器观察到的其他文件(例如settings.py)在你的构建中将完成这项工作。

同样如评论所示,版本控制最好留给VCS。

答案 1 :(得分:0)

有点hacky方式,但我找到了一种方法来强制Django服务器重新加载 build 目录的更改。在对Django自动加载模块进行一些研究之后,我发现它只能从加载到 sys.modules 的模块中收听Python文件的更改。所以,我只需要将构建目录变成Python模块:

在我的构建脚本(gulp)中,在我构建了我的文件之后,我添加了一个步骤来创建 __ init __。py 文件,以使构建目录成为模块。然后我还在这个文件中写了一个注释,其中包含一个时间戳,使其对每个构建都是唯一的:

fs.writeFile('./build/__init__.py', '#' + Date.now())

然后在我的 local.py (本地使用的设置)中,我只是导入这个新模块,因此它出现在 sys.modules 中:

try:
    import build
except ImportError:
    print("Could not import from build folder. Will not auto reload when building new files.")