Django:运行 runserver 之后的脚本

Django: Run a script right after runserver

上下文:

我在使用外部数据库值的数据库上有一个 table。这个外部数据库定期更新它的值。

问题:

为了在每次启动服务器时更新我的​​数据库,我想 运行 在 运行 服务器之后立即执行一个脚本。

可能的解决方案:

我看到可以从某个应用程序 运行 脚本,这是我感兴趣的东西。这可以通过使用 django-extensions:

https://django-extensions.readthedocs.io/en/latest/runscript.html

但是,此脚本仅 运行 具有以下命令:

python manage.py runscript your_script

是否有任何其他方法可以从应用程序 运行 脚本并在 运行 服务器命令后立即执行它?我愿意接受建议!

提前致谢

更新

感谢@Raydel Miranda 的评论,我觉得我留下了一些信息。

我的目标是,一旦我启动服务器,我计划打开一个套接字来维护我的数据库更新。

您可以在顶层执行代码urls.py。该模块被导入并执行一次。

urls.py

from django.confs.urls.defaults import *
from your_script import one_time_startup_function

urlpatterns = ...

one_time_startup_function()

我建议使用这样的东西,假设你有这样的脚本:

# abc.py

from your_app.models import do_something

do_something()

现在您可以 运行 在 运行 服务器之后立即执行此脚本(或您 运行 连接 django 应用程序的任何其他方式),如下所示:

python manage.py runserver & python manage.py shell < abc.py

仅供参考,它只有在您的终端中有 bash 时才有效(例如 Linux,MacOs)。

更新

仔细阅读您的问题后,我认为 运行在 runserver 之后添加脚本可能不是最佳解决方案。正如你所说:

This external database updates its values periodically.

所以,我认为您需要某种定期任务来执行此更新。您可以为此使用 cronjob or you can use Celery

运行 运行服务器之后的脚本似乎不是一个好主意,主要原因是你将有一个 window 因为服务器是 运行 (并且可用于用户),直到您完成数据同步。此外,如果您在 runserver 之后使用脚本进行同步,您之后将不会从外部数据库获得更新。

最好的解决办法是配置多个数据库,你可以使用只有读权限的外部数据库。这样您的视图将提供真正更新的数据。

另一方面...

如果想使用类似脚本的东西,最好写一个 Django custom command(这样你就不必处理初始化 django 设置和其他问题)并使用 cron 或 celery 作为@ruddra 执行它his/her 回答中的状态。

说到这里,你应该看到了:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/

This 可能会有帮助。 你可以编辑 yourapp/apps.py

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        # update my database here
        pass