Запустить контроллер Pylons как отдельное приложение?
Вопрос
У меня есть приложение 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
Решение
Я редактирую свой ответ и поддерживаю другой ответ Бена Бангерта, поскольку он правильный.Я ответил и с тех пор научился правильному способу (упомянутому ниже).Если вы действительно хотите, ознакомьтесь с историей этого ответа, чтобы увидеть неправильное (но рабочее) решение, которое я изначально предложил.
Другие советы
Если вы хотите загрузить части приложения 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 / etc, то это не сработает, поскольку для их существования требуется выполнение запроса.