После уточнения вашего варианта использования в комментарии к ответу Стюарта я предлагаю использовать 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. Просто убедитесь, что каталоги (в данном случае дома/журналы) существуют.
В какой системе вы используете свое приложение? Если вы находитесь в Linux или Unix (или OS X), вы можете настроить cronjob, который выполняется каждые N минут, чтобы выполнить пользовательскую команду 'manage.py'. Эта команда может проверять базу данных и выполнять вашу бизнес-логику для необработанных сообщений. – sthzg
Решение sthzg прост в применении и довольно легкий. Я бы рекомендовал это сделать, если вам не нужны очень точные сроки (cronjob будет +/- 1 минута). – spectras