Как запустить функцию при запуске до обработки запросов в Django?

Я хочу запустить некоторый код при запуске моего сервера Django, чтобы очистить предыдущий конец сервера. Как я могу запустить некоторый код один и только один раз при запуске, прежде чем сервер обработает какие-либо запросы. Мне нужно получить доступ к базе данных в это время.

Я прочитал в Интернете пару вещей, которые кажутся немного устаревшими и не гарантируют, что они будут запускаться только один раз.

Обновлять

Я рассмотрел предложенный ответ, изучив функцию ready. Кажется, это работает, но документально подтверждено, что вам не следует обращаться к этой базе данных (https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready).

Есть много предложений в Выполнять код при запуске Django только ОДИН РАЗ?, но поскольку этому посту несколько лет, я подумал, что могут быть какие-то дополнительные решения.

Это выглядит многообещающе

from django.dispatch import receiver
from django.db.backends.signals import connection_created

@receiver(connection_created)
def my_receiver(connection, **kwargs):
    with connection.cursor() as cursor:
        # do something to the database

    connection_created.disconnect(my_receiver)

Есть еще мысли?

Если он не обязательно должен быть в начале сервера, но может быть запущен до запуска сервера, вы можете просто создать пользовательскую команду управления и запустить ее перед запуском сервера.

Abdul Aziz Barkat 10.07.2024 20:03

Я хочу, чтобы он работал немного более автоматически при запуске сервера.

Peter Kronenberg 10.07.2024 21:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это часто делается с помощью метода .ready() [Django-doc] любого из классов AppConfig [Django-doc] установленного приложения. Итак, если у вас есть приложение app_name, вы можете работать с:

# app_name/apps.py

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    # …

    def ready(self):
        # my management command
        # …

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

Спасибо. Дополнительную информацию можно найти здесь: stackoverflow.com/questions/33814615/…, чтобы предотвратить повторный запуск. Я использовал `if os.environ.get('RUN_MAIN'):`

Peter Kronenberg 09.07.2024 21:22

@PeterKronenberg: ну, Django перезагружается только в режиме разработки. Возможно, что если вы используете, например, Gunicorn, он порождает несколько процессов, но, таким образом, один раз для каждого процесса.

willeM_ Van Onsem 09.07.2024 21:32

Будет ли эта проверка работать и в других средах? Я хочу убедиться, что он запускается только один раз, прежде чем принимать какие-либо запросы.

Peter Kronenberg 10.07.2024 00:20
RUN_MAIN является AFAIK специфичным для Django runserver, он не будет работать с другими методами выполнения. Ваша проверка будет зависеть от того, как вы развертываете приложение. Например, для gunicornпосмотрите этот ответ.
Vegard 10.07.2024 06:38

Я обновил свой вопрос

Peter Kronenberg 10.07.2024 19:22

Другие вопросы по теме