在Django app启动后只运行一次命令

时间:2018-05-16 07:06:46

标签: python django

我有一个基于django的函数,当应用程序启动时,需要在Django中只运行一次。棘手的部分是:

  • 相关代码大量使用django ORM,因此应用程序必须准备就绪,
  • 代码应该只运行一次 - 例如每个工作人员不是一次,而是每个“网站”一次(无论是通过带有十几个工作人员的gunicorn部署,还是通过内置的开发Web服务器在本地运行),
  • 代码应仅在应用程序启动时运行,但不应运行其他管理命令。代码可能需要一段时间才能完成,我不希望每次运行makemigrationsshell时触发它。
理论上,我可以引入一个锁定机制,让它在AppConfig.ready()方法中的某个地方运行,但它仍然可以在所有管理命令中运行。

由于应用程序打包在Docker中,我一直在考虑简单地将代码包装在单独的管理命令中,并在应用程序启动之前在入口点运行它。这似乎可以解决问题,但它只能在那个特定的容器中自动 - 如果有人运行本地开发服务器来自己处理应用程序,他可能不知道另外一个命令应该运行。

我搜索了文档,看起来Django本身并没有办法自己做这个。也许有一种我无法想到的更好的方法?

1 个答案:

答案 0 :(得分:0)

我有完全相同的需求。我在AppConfig.ready()中运行启动代码,具体取决于您不希望执行启动代码时必须设置的环境变量。

SKIP_STARTUP = settings.DEBUG or os.environ.get('SKIP_STARTUP')
class myapp(AppConfig):
    def ready(self):
        if not SKIP_STARTUP:
            <startup stuff>
相关问题