Django / Celery Beat - 定期任务只更新一次

时间:2015-03-15 23:43:35

标签: python django django-celery celerybeat

我目前正在尝试使用django& celerybeat定期执行以下任务以每分钟运行的任务。

@app.task
def update():

        ids = Website.objects.values_list('id', flat=True)

        for x in ids:

            entry = Website.objects.get(id=x)
            cur_url = entry.url
            status = isSiteLive(cur_url)
            entry.cur_status = status[0]
            entry.last_checked = time
            entry.http_code = status[1]
            entry.http_response = status[2]
            entry.save()

我已将任务设置为通过Django Admin界面中的Periodic_Tasks数据库表运行。一切都在第一次调用任务时 - 数据库表被更新,然后任务以正常方式继续。问题是上述任务只更新数据库一次,即使任务成功 - 第一次调用后数据库值也没有更新。

我尝试将其交换为定期任务,如下所示;但这也无济于事。

@celery.decorators.periodic_task(run_every=timedelta(minutes=1))
def update_websites():

    ids = Website.objects.values_list('id', flat=True)

    for x in ids:
        entry = Website.objects.get(id=x)
        cur_url = entry.url
        status = isSiteLive(cur_url)
        entry.cur_status = status[0]
        entry.last_checked = time
        entry.http_code = status[1]
        entry.http_response = status[2]
        entry.save()

我已经尝试用celerycam监控任务,但是当他们都成功时,我很难找到为什么这不能按预期工作。请帮忙,这让我发疯了。

感谢。

更新:

感谢您协助@Ruddra。

根据建议,我设法捕获导致问题的初始错误;

('Connection aborted.', gaierror(-2, 'Name or service not known'))

经过一些谷歌搜索后,我发现这是“请求”模块的问题。所以我然后从;

交换了我的isSiteLive()方法
def isSiteLive(url):

    r = requests.get(str(url))
    code = r.status_code
    code_desc = responses.get(code)
    responses.get(code)

    if code == 200:
      return (True, code, code_desc[1])
    else:
      return (False, code, code_desc[1])

def isSiteLive(url):

    http = urllib3.PoolManager()
    r = http.request('GET', str(url))
    code = r.status
    code_desc = responses.get(code)

    if code == 200:
      return (True, code, code_desc[1])
    else:
      return (False, code, code_desc[1])

只有现在,try / catch不再捕获任何错误,并且在运行后不会创建新模型。所以现在我回到第一个方向。我也尝试过使用urllib2,它也运行如上。任务已成功完成,但数据库未更新。

def isSiteLive(url):

    try:
        con1 = urllib2.urlopen(str(url))
        code = int(con1.getcode())
        code_desc = responses.get(code)
        if code == 200:
            return (True, code, code_desc[1])
        else:
            return (False, code, code_desc[1])

    except urllib2.URLError, e:
        err = e.message
        code = ''
        code_desc = 'Bad Response From Server'
        return (False, code, code_desc)

干杯萌芽。为文本墙道歉!

0 个答案:

没有答案