【发布时间】:2020-01-12 09:10:37
【问题描述】:
我有一些 django 代码需要在我的应用程序加载到开发服务器或作为 wsgi 工作者时运行一次。这段代码也需要写入数据库。在我的特殊情况下,我不需要为许多管理命令(如 collectstatic 或 createsuperuser 等)运行代码。
这个 SO question "Where to put Django startups code?" 建议使用 AppConfig.ready 来启动代码。
但是,docs for the ready function 明确警告不要与数据库交互:
尽管您可以如上所述访问模型类,但请避免在您的 ready() 实现中与数据库交互。这包括执行查询的模型方法(save()、delete()、管理器方法等),以及通过 django.db.connection 进行的原始 SQL 查询。您的 ready() 方法将在每个管理命令的启动期间运行。例如,即使测试数据库配置与生产设置分开,manage.py test 仍会针对您的生产数据库执行一些查询!
对于需要更新数据库的代码,我应该使用一些稍后的启动挂钩吗?
代码将我的服务器注册为具有 3rd 方服务的 webhook 端点,并将所需的连接信息存储在数据库中。如果尚未配置,我只会注册 webhook。
【问题讨论】:
-
“启动”到底是什么意思? django 环境可以在多种情况下初始化——启动开发服务器、启动 wsgi worker、运行任何管理命令。
-
您应该更具体地了解这段代码的作用。为什么你认为你需要在启动时更新数据库?
-
我已经编辑了我的问题,以澄清我只需要在开发服务器和 wsgi 工作人员案例中运行代码。
-
但肯定只需要ever为每一个发生一次,而不是每次启动服务器时。所以最好是作为一个管理命令,你可以在需要的时候运行。
-
@DanielRoseman,你提出了一个很好的观点。通常每个服务器只需要运行一次。我希望有一个比管理命令更自动化的解决方案。我有多个需要连接到 webhook 的服务器副本(测试、阶段、生产等)。管理命令是一个额外的步骤,有人最终会忘记让服务器脱离配置。
标签: django django-apps