如何使用Django后台任务初始化重复任务?

时间:2018-03-28 13:58:57

标签: django python-3.x asynchronous background-task

我正在研究一个django应用程序,它从dropbox读取csv文件,解析数据并将其存储在数据库中。为此,我需要后台任务,检查文件是否被修改或更改(更新),然后更新数据库。 我已经尝试过芹菜'但无法用django配置它。然后我找到 django-background-tasks ,它比芹菜配置起来要简单得多。 我的问题是如何初始化重复任务? 它在documentation中描述 但是我找不到任何解释如何使用重复 repeat_until 或文档中提到的其他常量的示例。
谁能解释下面的例子吗?

notify_user(user.id, repeat=<number of seconds>, repeat_until=<datetime or None>)


  

重复在几秒钟内给出。提供以下常量:   Task.NEVER(默认),Task.HOURLY,Task.DAILY,Task.WEEKLY,   Task.EVERY_2_WEEKS,Task.EVERY_4_WEEKS。

2 个答案:

答案 0 :(得分:2)

例如,假设您拥有文档中的功能

@background(schedule=60)
def notify_user(user_id):
    # lookup user by id and send them a message
    user = User.objects.get(pk=user_id)
    user.email_user('Here is a notification', 'You have been notified')

假设您想重复此任务每日,直到 2019年新年,您将执行以下操作

import datetime
new_years_2019 = datetime.datetime(2019, 01, 01)
notify_user(some_id, repeat=task.DAILY, repeat_until=new_years_2019)

答案 1 :(得分:1)

当你真的需要执行它时,你必须调用特定的函数(notify_user()) 假设您需要在请求到达服务器时执行任务,那么就像这样,

@background(schedule=60)
def get_csv(creds):
    #read csv from drop box with credentials, "creds"
    #then update the DB

def myview(request):
    # do something with my view
    get_csv(creds, repeat=100)
    return SomeHttpResponse


例外程序
1.请求到达网址,因此它会发送到相应的视图,这里myview()
2.超过行get_csv(creds, repeat=100),然后在DB中创建async task(它现在不会超出功能)
3.将HTTP响应返回给用户。

在创建任务的60秒后,get_csv(creds)将在每个100 seconds

重复执行