Flask - Apscheduler无法调用执行数据库命令的函数

时间:2012-09-07 15:32:11

标签: python flask scheduler

Python: 2.7.3

Flask: 0.9

嗨,我想用Apscheduler制作汽车模拟器。每辆车在数据库中都有distance列,将定期增加。

这是导入部分

from __future__ import with_statement
from flask import Flask, request, session, g, redirect, url_for, \
    abort, render_template, flash, views
from sqlite3 import dbapi2 as sqlite3
from contextlib import closing
from apscheduler.scheduler import Scheduler

这是代码的片段:

sched = Scheduler()
sched.add_interval_job(moveAllCars, seconds = 5)
sched.start()

def moveAllCars():
    print "debug 1"
    dbCommand = g.db.execute('SELECT CarID FROM Car')
    print "debug 2"
    #and so on

我没有编写完整的代码,因为错误发生在“debug 1”之后,并显示错误消息:找不到处理程序“apscheduler.scheduler”的处理程序。谷歌没有多大帮助。

但调度程序仍在运行,每5秒只打印一次'debug1'。错误消息仅在第一个循环期间出现。

有人知道解决方案吗?先谢谢

[UPDATE]

使用logging后,我发现它是RunTimeError:在请求上下文之外工作。除了与app.test_request_context一起使用之外还有其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

g可能是threading.local()。不同的线程在其中看到不同的值。

每个请求可能为

g.db分配了一个新的数据库连接。没有当前请求 - 没有连接。

您可以在move_all_cars()中创建数据库连接,或者将其作为参数显式传递。

答案 1 :(得分:3)

from os import getcwd
import logging
logging.basicConfig(
        filename=''.join([getcwd(), '/', 'log_file_name']),
        level=logging.DEBUG,
        format='%(levelname)s[%(asctime)s]: %(message)s'
)

以上在我的案例中有所帮助。

卡茨珀