2015-06-03 2 views
0

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

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

+3

В какой системе вы используете свое приложение? Если вы находитесь в Linux или Unix (или OS X), вы можете настроить cronjob, который выполняется каждые N минут, чтобы выполнить пользовательскую команду 'manage.py'. Эта команда может проверять базу данных и выполнять вашу бизнес-логику для необработанных сообщений. – sthzg

+0

Решение sthzg прост в применении и довольно легкий. Я бы рекомендовал это сделать, если вам не нужны очень точные сроки (cronjob будет +/- 1 минута). – spectras

ответ

1

После уточнения вашего варианта использования в комментарии к ответу Стюарта я предлагаю использовать cronjobs и пользовательскую команду manage.py.


Модель
Чтобы отфильтровать все уведомления, которые не были переданы его хорошая идея, чтобы иметь флаг на модели, например, is_notified = models.BooleanField(default=False). Таким образом, быстро и легко фильтровать необходимые сообщения, например. с MyModel.objects.filter(is_notified=False, 'send_on__lte': datetime.now()).


Пользовательская команда manage.py
В команде пользовательских manage.py вы имеете полный доступ к вашей установке Django. Запись их задокументирована в Writing custom django-admin commands.

Команда обычно (по крайней мере):

  • фильтр все уведомления, которые должны быть отправлены
  • итерацию над ними и попытайтесь отправить электронную почту
  • когда удачен, is_notified в True и сохранить экземпляр

Cronjob
cronjob прост в установке. $ crontab -l перечисляет все установленные cronjob. $ crontab -e откроет редактор по умолчанию (возможно, vi (m) или nano), чтобы добавить новые cronjob.

Пример: запуск команды каждые 5 минут:

*/5 * * * * /home/foobar/my-virtualenv/bin/python /home/foobar/my-django-dir/manage.py my_django_command >> /home/logs/my_django_command.log 2>&1 

Добавление делается путем вставки фрагмента кода на новую строку в файл, который открывается после вызова $ crontab -e и сохранения файла.

*/5 * * * *
определяет для запуска cronjob каждые пять минут.

/home/foobar/my-virtualenv/bin/python
указывает называть Python из ваших virtualenv (если используется), а не версии системы.

/home/foobar/my-django-dir/manage.py my_django_command
называет ваш manage.py команду так же, как вы могли бы сделать.

>> /home/logs/my_django_command.log 2>&1
указывает, что все выходные данные (стандартный вывод и ошибки), порожденную manage.py команды будут сохранены в файл my_django_command.log. Просто убедитесь, что каталоги (в данном случае дома/журналы) существуют.

0

Нужны ли они для печати на странице без обновления пользователем страницы в браузере? Если это так, вам нужно написать код JavaScript AJAX для непрерывного опроса вашего приложения для нового контента для записи на страницу.

Вот пример учебник по AJAX с помощью Django: https://realpython.com/blog/python/django-and-ajax-form-submissions/

+1

У вас есть точка: @JMzance: где эти сообщения должны отображаться? – spectras

+0

В производственной версии они будут фактически отправлены по электронной почте - так что этот подход не будет работать. Я надеялся, что есть способ сделать это, просто используя django – JMzance

+0

Затем просто переопределите метод сохранения связанной модели или используйте сигналы, чтобы поймать, когда новая запись зарегистрирована в базе данных. – FallenAngel