Je voudrais absolument vous à m'ennuyer avec des détails sur le quoi et le pourquoi, spécifiques à l'application des trucs, etc
Ho. Eh bien vous l'avez demandé!
Comme Daniel personnellement, j'utilise Apache avec mod_wsgi. Il est encore assez nouveau que de le déployer dans certains environnements, peut être un combat, mais si vous compilez vous-même tout de toute façon, c'est assez facile. Je l'ai trouvé très fiable, de même que les premières versions. Accessoires pour Graham Dumpleton pour garder le contrôle d'elle assez bien par lui-même.
Cependant pour moi, il est essentiel que WSGI applications fonctionnent sur tous les serveurs possibles. Il y a un peu d'un trou à l'heure actuelle dans ce domaine: vous avez le standard WSGI vous dire ce qu'est un WSGI remboursables (application), mais il n'y a pas de normalisation de déploiement; pas une seule façon de dire au serveur web où trouver l'application. Il ya aussi pas de manière standardisée pour que le serveur de rechargement de l'application lorsque vous avez mis à jour.
L'approche que j'ai adoptée est de mettre:
toute la logique de l'application en modules/packages, de préférence dans les classes
tous site-spécifique personnalisations à être fait par dérivation de l'Application principale et dominante membres
tous les spécifiques au serveur les paramètres de déploiement (par exemple. la connexion à la base de l'usine, de relais de messagerie paramètres) dans la classe __init__() paramètres
un haut-niveau "application.py" le script qui initialise la classe d'Application avec le déploiement correct des paramètres pour le serveur actuel, puis exécute l'application d'une telle manière qu'il puisse travailler déployé comme un script CGI, un mod_wsgi WSGIScriptAlias (ou le Passager, qui apparemment fonctionne de la même manière), ou peut être en interaction avec la ligne de commande
un module d'aide qui prend soin de ci-dessus les problèmes de déploiement et permet à l'application d'être rechargé lorsque les modules de l'application repose sur le changement
Donc, ce que l'application.py ressemble à la fin est quelque chose comme:
#!/usr/bin/env python
import os.path
basedir= os.path.dirname(__file__)
import MySQLdb
def dbfactory():
return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p')
def appfactory():
import myapplication
return myapplication.Application(basedir, dbfactory, debug= False)
import wsgiwrap
ismain= __name__=='__main__'
libdir= os.path.join(basedir, 'system', 'lib')
application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)
Le wsgiwrap.Wrapper vérifie toutes les 10 secondes pour voir si l'un des modules de l'application dans libdir ont été mis à jour, et si oui fait un peu méchant sys.les modules de la magie pour décharger en toute sécurité. Puis appfactory() sera appelée de nouveau pour obtenir une nouvelle instance de l'application mise à jour.
(Vous pouvez également utiliser les outils de ligne de commande tels que
./application.py setup
./application.py daemon
pour exécuter un programme d'installation et d'arrière-plan-tâches crochets fournis par l'application appelable - un peu comme la façon dont distutils œuvres. Il répond également à démarrer/arrêter/redémarrer comme un script init.)
Une autre astuce que j'utilise est de mettre les paramètres de déploiement de plusieurs serveurs (développement/test/production) dans le même application.py script, et de renifler de la prise.gethostname()' pour décider laquelle spécifiques au serveur tas de paramètres à utiliser.
À un certain point, j'ai peut-paquet wsgiwrap et de libérer correctement (peut-être sous un autre nom). En attendant, si vous êtes intéressé, vous pouvez voir une dogfood-version de développement au http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py.