有什么办法可以在特定时间运行特定功能吗?

时间:2019-08-13 08:52:56

标签: python django

我现在正在建立一个网站,老师可以宣布作业,学生们可以提交作业。我创建了可以发布公告或提交但不知道如何检查未提交作业的董事会的董事会。我希望某些功能在指定的时间自动运行(在这种情况下,在作业的到期日,该功能将判断并收集未完成作业的人)

我在找一些与日期时间有关的库,但不知道。

assignments / models.py

class Assignment(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    index_in_group = models.IntegerField()
    title = models.CharField(max_length=30, verbose_name='name')
    content = models.TextField(verbose_name=content')
    due_date = models.DateTimeField(verbose_name='due')
    created_at = models.DateTimeField(auto_now_add=True)

class Done(models.Model):
    assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)
    index_in_assignment = models.IntegerField()
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    done_img = models.ImageField(upload_to='AssignmentsDone')
    injung = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)

该功能将是这样的:(不是确切的功能-只是备忘录)

def check_submission(request, assignment_id):  
    members = Members of the group (I will retrieve this thoroughly when actually code)
    submissions = Done.objects.filter(assignment.id = assignment_id)
    did_hw = [x.author for x in submissions]
    for member in members:
        if member not in did_hw:
            mark as unsubmitter

这篇文章过长..但是问题实际上很简单。我只是想知道是否有一种方法可以使用户在特定的指定时间工作。

4 个答案:

答案 0 :(得分:2)

您可以在Django中使用celery:

Celery

然后,如果您具有这样的功能:

@shared_task
def add(x, y):
    return x + y

您将可以在管理面板上对其进行访问,并且可以安排其运行时间。

运行任务的方法很少:

1-间隔运行任务。 (例如,每10秒一次)

2-延迟任务。 (task_function.delay()

3-计划在特定时间运行任务。

注意:您需要用芹菜拍打定期执行的任务:celery/django-celery-beat

根据您的情况,您可以创建一个检查所有分配的函数,然后每5分钟运行一次此函数,或者如果到期日期都固定,只需在特定时间运行该函数即可。

答案 1 :(得分:0)

您可以使用

https://django-cron.readthedocs.io/en/latest/installation.html所有事物自动管理

OR

{{3}}(半自动,半手动

OR

即使您使用OS Cron来运行特定的Django函数。 (需要手动处理

答案 2 :(得分:0)

另一个计划实用程序是Advanced Python Scheduler:apscheduler

您可以安排任务;或多个任务,以每个间隔运行或以CRON之类的命令运行

从他们的例子中

from datetime import datetime
import os

from apscheduler.schedulers.blocking import BlockingScheduler


def tick():
    print('Tick! The time is: %s' % datetime.now())


if __name__ == '__main__':
    scheduler = BlockingScheduler()
    scheduler.add_job(tick, 'interval', seconds=3)
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass

答案 3 :(得分:0)

这是一种香草方式

文档在那里:http://docs.python.org/py3k/library/sched.html

from datetime import datetime
now = datetime.now()


from datetime import timedelta
run_at = now + timedelta(hours=3)
delay = (run_at - now).total_seconds()

然后可以使用threading.Timer:

threading.Timer(delay, self.update).start()