将Pylons控制器作为单独应用运行?

11 投票
2 回答
1507 浏览
提问于 2025-04-11 09:24

我有一个用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的那个答案点赞,因为他的答案是正确的。我之前回答过这个问题,但后来我学到了正确的方法(下面会提到)。如果你有兴趣,可以查看这个答案的历史,看看我最开始提出的那个错误(但能用的)解决方案。

撰写回答