重复使用Django代码自动重载功能以用于自定义管理命令

Ole*_*siy 6 django django-command-extensions

我喜欢django服务器如何在代码更改时自动重新加载自身,因此无需重新启动服务器。

当前,我们使用django自定义管理命令,这可能需要很长时间才能完成。

有什么方法可以对我们的管理命令使用django服务器的自动重载功能?

例如,如果检测到基础django代码库的更改,该命令将重新加载自身并恢复非常长(无状态)循环的执行。

Chi*_*and 7

无论您的管理命令做什么,都将其抽象为单个函数并使用以下命令调用该函数 django.utils.autoreload.main

from django.utils import autoreload

def do_something(*args, **kwargs):
    # management command logic


class Command(BaseCommand):

    def handle(self, *args, **options):
        self.stdout('This command auto reloads. No need to restart...')
        autoreload.main(do_something, args=None, kwargs=None)
Run Code Online (Sandbox Code Playgroud)

对于django 2.2或更高版本使用

        autoreload.run_with_reloader(do_something, args=None, kwargs=None)
Run Code Online (Sandbox Code Playgroud)

  • `autoreload.main()` 现已消失 https://github.com/django/django/commit/c8720e7696ca41f3262d5369365cc1bd72a216ca#diff-46e69f287173eef41fcbfeba05501954 (4认同)

Sam*_*lan 4

使用django.utils.autoreload模块检查runserver(特别是 run 方法)的执行方式。您需要使用自定义命令复制此模式。