【问题标题】:Is it possible to automatically run a function on django app thru settings.py?是否可以通过 settings.py 在 django 应用程序上自动运行功能?
【发布时间】:2020-11-08 18:07:23
【问题描述】:

我的views.py上有这个函数,我需要在运行python manage.py runserver后自动运行它,一个人说我必须在settings.py上运行那个函数。我试过了,但我无法将视图和模型导入到我的 settings.py 中(可能是因为我是菜鸟?)所以我不能按照他的建议去做。

这是过程,我有一个切换按钮,用于在我的前端 javascript(vuejs) 上启用和禁用 auto_sms 功能。

如果我选择enable,它将通过 axios 调用auto_sms 的 API 端点。就像在 while 循环中执行此操作一样,每 30 分钟检查一次,然后重复直到执行然后重置。等待另一个条件有效。 responses.count()

如果我选择 disable,它将通过 axios 调用 disable_sms 的 API 端点(我还没有开始编码)。就像如果它检测到auto_sms is true 然后将其设为假。

我想问,我对我的申请的想象是否可能发生?

@models.py

class Rainfall(models.Model):
    level = models.CharField(max_length=10, blank=True, default='')
    amount = models.FloatField()
    timestamp = models.DateTimeField(auto_now_add=True)

    def update_level(self):
        if 0.1 <= self.amount < 2.5:
            return 'Light'
        elif 2.5 <= self.amount < 7.5:
            return 'Moderate'
        elif 7.5 < self.amount < 15:
            return 'Heavy'
        elif 15 <= self.amount < 30:
            return 'Intense'
        elif 30 <= self.amount < 50:
            return 'Torrential'

    def save(self, *args, **kwargs):
        if not self.level:
            self.level = self.update_level()
        super().save(*args, **kwargs)



class Sms(models.Model):
    description = models.CharField(max_length=100, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)

@views.py

def send_sms(request):
    z = Rainfall.objects.latest('timestamp')
    numbers = Mobile.objects.all()
    message = (f'Test: ({z.timestamp})')

    account_sid = '**********'
    auth_token = '*********'

    client = Client(account_sid, auth_token)
    for i in numbers:
        client.messages.create(to=i.mobile_number,
                               from_='********',
                               body=message)

    record = Sms.objects.create(description=f'{message}')
    record.save()

    return HttpResponseRedirect('/home/', 200)


def auto_sms(request):
    responses = Rainfall.objects.filter(
        level='Torrential' or 'Intense',
        timestamp__gt=now() - timedelta(days=1),
    )
    if responses.count() >= 5:
        send_sms(request)

    return HttpResponse(200)

【问题讨论】:

  • 即使没有用户处于活动状态,您是否需要在后台定期运行任务?
  • 是的,完全正确。我该怎么做?

标签: django vue.js django-rest-framework


【解决方案1】:

你可以同时使用 Redis + Celery 和 Django。

简单地说,

如果你有一个任务,然后将它从 Django 发送到 Redis,在一定时间后/根据你的命令它会要求 celery 运行它。

Google 更多关于他们的信息。

https://www.codingforentrepreneurs.com/blog/celery-redis-django#:~:text=Redis%20is%20a%20message%20broker,to%20make%20real%2Dtime%20magic.

【讨论】:

  • 我把它发送到redis后,是否可以通过切换按钮禁用它?
  • 是可以的,要获取Hawk视图,请研究它如何与其他资源一起工作,Celery是一个专注于实时处理的任务队列,同时还支持任务调度。 Redis 是一个消息代理。这意味着它处理 Django 和 Celery 之间的“消息”队列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2010-09-20
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多