将Pylons控制器作为单独应用运行?
我有一个用Pylons框架做的应用,现在想把一些逻辑移到一个单独的批处理程序里。我之前在主应用里测试过,但这个新程序会在数据库里做很多工作,所以我希望它能作为一个独立的进程,持续在后台运行。主应用会把任务提交到数据库,而这个新进程会处理每个任务请求。
我该如何把一个控制器作为独立的脚本启动呢?
我现在有:
from warehouse2.controllers import importServer
importServer.runServer(60)
在控制器文件里,但不是控制器类的一部分:
def runServer(sleep_secs):
try:
imp = ImportserverController()
while(True):
imp.runImport()
sleepFor(sleep_secs)
except Exception, e:
log.info("Unexpected error: %s" % sys.exc_info()[0])
log.info(e)
但是在命令行启动ImportServer.py时,出现了:
2008-09-25 12:31:12.687000 Could not locate a bind configured on mapper Mapper|I
mportJob|n_imports, SQL expression or this Session
2 个回答
11
如果你想在Pylons应用中加载一些部分,比如从Pylons外部加载模型,首先要在脚本中加载Pylons应用:
from paste.deploy import appconfig
from pylons import config
from YOURPROJ.config.environment import load_environment
conf = appconfig('config:development.ini', relative_to='.')
load_environment(conf.global_conf, conf.local_conf)
这样做会加载Pylons应用,这样就能设置好大部分状态,让你可以使用SQLAlchemy的模型和会话来操作数据库。
需要注意的是,如果你的代码使用了Pylons的全局变量,比如请求(request)、响应(response)等,那就不行了,因为这些变量需要有一个正在进行的请求才能存在。
1
我在修改我的回答,并给Ben Bangert的那个答案点赞,因为他的答案是正确的。我之前回答过这个问题,但后来我学到了正确的方法(下面会提到)。如果你有兴趣,可以查看这个答案的历史,看看我最开始提出的那个错误(但能用的)解决方案。