Периодический вызов функции django - PullRequest
0 голосов
/ 30 ноября 2018

Это вопрос новичка о веб-разработке.Я пытаюсь найти безопасный и лучший способ для разработчиков вызывать и запускать функцию, которая отправляет электронные письма из моего приложения django, которые они могут переопределять и отправлять вручную, а также могут быть активированы по времени, таким образом отправляя электронную почту периодически в фиксированное времянеделю.

Я нашел ответ, предлагающий использовать сельдерей на Периодически запускать функцию в Django

Но я хочу изменить периоды без повторного развертывания моего приложения.Я провел некоторое исследование инструментов aws и думаю, что это комбинация шлюза AWS и лямбда-aws и облачных часов aws для отправки URL / конечной точки (или запроса на получение) в мое веб-приложение для активации функции.

Вмомент у меня что-то вроде ниже.

views.py

def api_send_email(request):

    #insert send email function
    print ("sending")

    return redirect('/')

urls.py

urlpatterns = [
    url(r'^send_email$', api_send_email, name="api_send_email"),
]

Таквышеприведенное может быть вызвано вручную, перейдя по URL https // xxx / send_email или периодически отправляя запрос get на этот URL из aws.Вместо этого я подумал о том, чтобы выполнить пост-запрос, который сделает его более безопасным, но я не уверен, что инструменты aws могут это сделать, потому что для этого требуется токен csrf в самом приложении.

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

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

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

Затем вы можете использовать свою логику в модели, чтобы определить, следует ли отправлять электронное письмо в это время.Например:

class YourTaskConfig(models.Model):
    SEND_CHOICES = (
        ('minute': 'minute'),
        ('hour': 'hour'),
        ('day': 'day'),
    )
    send_every = models.CharField(max_length=25, choices=SEND_CHOICES)
    interval_amount = models.IntegerField()
    last_executed = models.DateTimeField(auto_add_now=True)
    is_active = models.BooleanField(default=True)

    def should_run(self):
       now = timezone.now()
       if self.send_every == 'minute':
           td = datetime.timedelta(seconds=self.interval_amount*60)
       elif self.send_every == 'day':
           td = datetime.timedelta(days=self.interval_amount)
       ... # rest of the logic on time delta
       if now - self.last_executed >= td:
           self.save()  # Updates current execution time
           return True
       return False

Ваша модель Email может иметь FK для этой конфигурации (если она есть):

class Email(models):
    config = models.ForeignKey(YourTaskConfig, on_delete=models.DO_NOTHING)

И использовать ее для периодических задач:

from celery.task.schedules import crontab
from celery.decorators import periodic_task


@periodic_task(run_every=(crontab(minute='*/5')), name="some_task", ignore_result=True)  # Runs every 5 minute
def some_task():
    for i in YourTaskConfig.objects.filter(is_active=True):  # run only active tasks
        should_send_email = i.should_run()
        if should_send_email:
            i.email_set.all()  # Here you go, you have your emails which you want send

К вашему сведению: это непроверенный код, но вы можете получить общее представление об этом решении.Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...