上下文:
我在数据库上有一个表,该表使用来自外部数据库的值。该外部数据库会定期更新其值。
问题:
为了每次启动服务器时更新数据库,我想在运行服务器之后立即运行一个脚本。
潜在的解决方案:
我已经看到可以从某个应用程序运行脚本,这是我感兴趣的事情。这可以通过使用django-extensions
来实现:
https://django-extensions.readthedocs.io/en/latest/runscript.html
但是,此脚本仅使用以下命令运行:
python manage.py runscript your_script
还有其他方法可以从应用程序运行脚本并在runserver命令之后立即执行该脚本吗?我愿意接受建议!
预先感谢
更新
感谢@Raydel Miranda的发言,我觉得我留下了一些信息。
我的目标是,一旦启动服务器,我打算打开一个套接字来维护数据库的更新。
答案 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
之后运行脚本可能不是最佳解决方案。如您所说:
此外部数据库会定期更新其值。
答案 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