Exécuter le contrôleur Pylons en tant qu'application séparée?
Question
J'ai une application Pylons dans laquelle je voudrais déplacer une partie de la logique vers un traitement par lots séparé. Je l'ai exécuté sous l'application principale à des fins de test, mais la base de données fera beaucoup de travail et j'aimerais qu'il s'agisse d'un processus distinct qui s'exécutera en arrière-plan en permanence. L'application Pylons principale soumettra les travaux à la base de données et le nouveau processus effectuera le travail demandé pour chaque travail.
Comment lancer un contrôleur en tant que script autonome?
J'ai actuellement:
from warehouse2.controllers import importServer
importServer.runServer(60)
et dans le fichier du contrôleur, mais ne faisant pas partie de la classe du contrôleur:
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)
Mais le démarrage de ImportServer.py sur la ligne de commande entraîne:
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
La solution
Je rédige ma réponse et je vote contre l'autre réponse de Ben Bangert, car c'est la bonne. J'ai répondu et depuis j'ai appris la bonne façon (mentionné ci-dessous). Si vous le souhaitez vraiment, consultez l’historique de cette réponse pour connaître la mauvaise solution (mais efficace) que j’avais proposée à l’origine.
Autres conseils
Si vous souhaitez charger des parties d'une application Pylons, telles que les modèles extérieurs à Pylons, chargez d'abord l'application Pylons dans le script:
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)
Cela chargera l'application Pylons, qui configure la plupart de l'état afin que vous puissiez utiliser les modèles SQLAlchemy et Session pour utiliser la base de données.
Notez que si votre code utilise les pylônes globaux tels que demande / réponse / etc., cela ne fonctionnera pas car ils nécessitent qu'une requête soit en cours d'existence.