Django - Обход загрузки кода в функции apps.ready при выполнении миграций или миграции в базу данных
Для начала, я искал это раньше, но безуспешно, чтобы найти что-то вокруг этого.
История:
Я создал приложение для инвентаризации на работе, чтобы помочь моей команде быстро просматривать статистику по нашей ИТ-инфраструктуре. У меня есть потоки, запускаемые при загрузке приложения, чтобы запустить некоторые функции скраппинга. Этот код работает отлично, но это происходит всякий раз, когда я создаю и применяю миграции базы данных (manage.py makemigrations & manage.py migrate).
Цель:
Я хотел бы запускать код скраппинга только при выполнении команды runserver (manage.py runserver). Таким образом, у меня не будет ресурсов, конкурирующих между действиями по миграции и скремблированию. Это также часто приводит к появлению большого количества ошибок, поскольку иногда не все модели/поля базы данных еще существуют в базе данных.
Идеи:
Modify the code in the django repository to introduce a flag that I can then check against before I have the scraping code run. Not recommended This will get overwritten when I update django, and it won't persist between my dev server and prod server.
Find a way to check which command is being run with the manage.py, and introduce a check to only start scraping if that command is run. Recommended This stays in my codebase and can easily be moved around between dev and prod instances.
Я открыт для других идей, как этого добиться. Если есть другой способ запустить действия по скраппингу при запуске приложения, то это тоже может сработать. Функция apps.ready - это единственное, что я смог найти, чтобы запустить что-то при запуске приложения.
Тот факт, что вы пытаетесь обойти код, означает, что код находится не в том месте. Запуск скребка не относится к apps.ready
, потому что вам нужно, чтобы он запускался только в некоторых ситуациях, но не в других.
Кроме того, запуск скрап-кода при выполнении ./manage.py runserver
звучит как плохая идея. Вы должны использовать runserver
только для разработки, а не в качестве реального веб-сервиса в производственной среде. Вместо этого вам следует развернуть настоящий веб-сервер, такой как Apache или Nginx.
Вы можете запустить код скраппинга с помощью задания cron или другого планировщика. Если запуск этого кода скраппинга сложен, то bash-скрипт или команда управления - отличный способ инкапсулировать то, что должно быть сделано.
Подумав над этим, я нашел простое решение, введя таймер сна в начале потока, который управляет функцией скрапирования. Это позволяет мне выполнять команды makemigrations и migrate без немедленного запуска потока scraping.
Я также рассматривал возможность использования Apache с mod_wsgi, однако оба экземпляра dev и prod работают под Windows, а mod_wsgi трудно запустить под Windows без некоторых доработок. Возможно, со временем я перенесу это на unix-хост, но это потребует дополнительной работы, которую я бы не хотел делать в настоящее время.