Django:在runserver之后立即运行脚本

时间:2019-01-17 05:33:17

标签: python django django-settings

上下文:

我在数据库上有一个表,该表使用来自外部数据库的值。该外部数据库会定期更新其值。

问题:

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

潜在的解决方案:

我已经看到可以从某个应用程序运行脚本,这是我感兴趣的事情。这可以通过使用django-extensions来实现:

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

但是,此脚本仅使用以下命令运行:

python manage.py runscript your_script

还有其他方法可以从应用程序运行脚本并在runserver命令之后立即执行该脚本吗?我愿意接受建议!

预先感谢

更新

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

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

4 个答案:

答案 0 :(得分:2)

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

# abc.py

from your_app.models import do_something

do_something()

现在,您可以像下面这样在runserver(或运行django应用程序的任何其他方式)之后立即运行此脚本:

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

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

更新

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

  

此外部数据库会定期更新其值。

因此,我认为您需要某种定期的任务才能进行此更新。您可以使用cronjob或为此使用Celery

答案 1 :(得分:1)

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

urls.py

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

urlpatterns = ...

one_time_startup_function()

答案 2 :(得分:1)

在runserver之后运行脚本似乎不是一个好主意,主要原因是由于服务器正在运行(并且可供用户使用),因此您将拥有一个窗口,直到完成数据同步为止。另外,如果您在runserver之后使用脚本进行同步,则此后您将无法从外部数据库获取更新。

对此的最佳解决方案是配置多个数据库,您可以仅以读取访问权限使用外部数据库。这样,您的视图将提供真正更新的数据。

另一方面...

如果要使用类似脚本的脚本,最好编写Django custom command(这样,您不必处理django设置的初始化和其他问题),并按照@ruddra的说明使用cron或celery执行它。他/她的答案。

表示这一点,您应该看到以下内容:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/

答案 3 :(得分:0)

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

class MyAppConfig(AppConfig):
    name = 'myapp'

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