Django: запустить скрипт сразу после runserver - PullRequest
0 голосов
/ 17 января 2019

Контекст:

У меня есть таблица в базе данных, которая использует значения из внешней базы данных.Эта внешняя база данных периодически обновляет свои значения.

Проблема:

Чтобы обновлять свою базу данных каждый раз, когда я запускаю сервер, я хочу запустить скрипт сразу после сервера запуска.

Потенциальное решение:

Я видел, что можно запустить скрипт из определенного приложения, и это то, что меня интересует. Это достижимо с помощью django-extensions:

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

Однако этот сценарий выполняется только со следующей командой:

python manage.py runscript your_script

Есть ли другой способ запустить скрипт из приложения и выполнить его сразу после команды runserver?Я открыт для предложений!

Заранее спасибо

Обновление

Спасибо @Raydel Miranda за замечания, я чувствую, что оставил некоторую информацию позади,

Моя цель: после запуска сервера я планирую открыть сокет для обновления базы данных.

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Это может помочь. Вы можете редактировать yourapp / apps.py

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        # update my database here
        pass
0 голосов
/ 17 января 2019

Я бы порекомендовал использовать что-то вроде этого, допустим, у вас есть такой скрипт:

# 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 может быть не лучшим решением. Как вы сказали:

Эта внешняя база данных периодически обновляет свои значения.

Итак, я думаю, вам нужно какое-то перодическое задание для этого обновления. Вы можете использовать cronjob или вы можете использовать Сельдерей для этого.

0 голосов
/ 17 января 2019

Запуск сценария после запуска сервера не очень хорошая идея, основная причина в том, что у вас будет окно, так как сервер работает (и доступен для пользователей), пока вы не закончите синхронизацию своих данных. Также, если вы синхронизируете с использованием скрипта после runserver, вы не будете получать обновления от внешней базы данных после этого.

Лучшее решение для этого - настроить несколько баз данных, вы можете использовать внешнюю базу данных только с правом чтения. Таким образом, ваши представления предоставят действительно обновленные данные.

С другой стороны ...

Если вы хотите использовать что-то вроде скрипта, лучше написать Пользовательскую команду Django (таким образом, вам не нужно иметь дело с инициализацией настроек django и другими проблемами) и выполнить ее, используя cron или celery как @ruddra заявляет в своем ответе.

Сказал, что вы должны увидеть это: https://docs.djangoproject.com/en/2.1/topics/db/multi-db/

0 голосов
/ 17 января 2019

Вы можете выполнить код на верхнем уровне urls.py. Этот модуль импортируется и выполняется один раз.

urls.py

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

urlpatterns = ...

one_time_startup_function()
...