我目前正在尝试使用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)
干杯萌芽。为文本墙道歉!