Django: запустить скрипт сразу после runserver

Для нескольких платформ, работающих с LANG до C.UTF-8 (или en_US.UTF-8 и т. д.), будет работать:

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ LANG=C.UTF-8 git diff --no-index --word-diff=plain --word-diff-regex=. -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
[-人-]{+丁+}

Однако LANG, похоже, не соблюдается на некоторых платформ (например, Git для Windows ):

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ LANG=C.UTF-8 git diff --no-index --word-diff=plain --word-diff-regex=. -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
[--]{+<81>+}

Обходной путь на этих платформах заключается в предоставлении необработанных байтов для символов UTF-8 (например, $'[^\x80-\xBF][\x80-\xBF]*' для '.' ) для git diff:

$ echo '人' >test1.txt && echo '丁' >test2.txt
$ git diff --no-index --word-diff=plain --word-diff-regex=$'[^\x80-\xBF][\x80-\xBF]*' -- test1.txt test2.txt
diff --git a/test1.txt b/test2.txt
index 3ef0891..3773917 100644
--- a/test1.txt
+++ b/test2.txt
@@ -1 +1 @@
[-人-]{+丁+}

2
задан Alvaro 17 January 2019 в 06:45
поделиться

4 ответа

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

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        # update my database here
        pass
0
ответ дан Rhys Pang 17 January 2019 в 06:45
поделиться

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

urls.py

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

urlpatterns = ...

one_time_startup_function()
0
ответ дан Exprator 17 January 2019 в 06:45
поделиться

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

# 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 или вы можете использовать Сельдерей для этого.

0
ответ дан ruddra 17 January 2019 в 06:45
поделиться

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

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

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

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

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

0
ответ дан Raydel Miranda 17 January 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: