2010-08-11 25 views
6

Après avoir lutté avec des choses différentes ici et là, j'ai finalement pu obtenir BottlePY sur Apache et lancer un site alimenté par MongoDB. Je suis habitué à exécuter des applications Django, donc je vais vous en parler un peu dans ma question.Pourquoi ma connexion MongoDB distante nécessite-t-elle une authentification sur chaque requête?

Le problème

Chaque fois qu'une page est chargée via BottlePY, la connexion à la base de données MongoDB situé sur MongoHQ.com doit être ré-authentifié (ce qui signifie qu'il a probablement de se reconnecter).

Ce que je trouve

J'attaché une fonction db.keep_alive() en haut de chaque fonction de modèle, de sorte que avant toute requête MongoDB est exécuté, il essaye d'exécuter une requête simple. En cas d'échec, il saisit les erreurs OperationFailure ou AutoReconnect, puis appelle la fonction db.authenticate(). Après qu'il réauthentifie, je l'ai ajouter un journal à un DB de journaux pour surveiller à quelle fréquence il doit réauthentifier. Actuellement, il doit se réauthentifier sur chaque chargement de page (ce qui nécessite l'exécution d'une requête). Ce n'est pas correct.

Différence de Django

J'utilise ce même concept dans django, et ont constaté que la connexion db ne doit être authentifié après 10-15 minutes de aucune requête en cours d'exécution. Je ne comprends pas pourquoi créer une connexion pymongo dans django serait différent de créer une connexion en bouteille, puisque j'utilise le même pilote, les mêmes fonctions et les mêmes méthodes. Je n'utilise pas d'ORMS ou quelque chose comme ça non plus.

Versions

  • Bouteille: 0.9.dev
  • Django: 1.2.1 finale
  • PyMongo: 1,8

J'apprécie l'aide!

Mise à jour: Un ami a été capable de jeter un coup d'œil et a remarqué ce qui suit pour répondre à ma question.

Il semble que chaque demande est le lancement d'un nouveau processus de Python, comme opposé à Django, dans lequel un seul processus reste en cours d'exécution pendant une longue période de temps .

+0

Vous devez vous authentifier autant de fois que le nombre de vos processus de travail. Vous ne pouvez pas réutiliser les connexions de base de données entre processus. Donc les premiers pensent que vous devez résoudre dans votre framework (indépendamment de MongoDB), qu'il n'y a qu'un petit nombre de processus (dans un pool de travailleurs) dans votre framework servant vos requêtes. os.getpid() devrait retourner seulement quelques valeurs disjointes. – pts

+0

comment lancez-vous votre python à l'intérieur d'apache: via mod_python ou wsgi? –

+0

@pts Merci! Je regarde dans ceci. @ ralf.w. WSGI sur Apache2 –

Répondre

1

Ce juste a fini par être une chose bizarre entre la bouteille et MongoHQ.Aucune solution réelle n'a été trouvée, mais je ne pouvais pas la recréer avec d'autres frameworks. Toutes les autres idées sont appréciées.

0

Votre apache xxx.conf contient quelque chose comme:

WSGIDaemonProcess project user=mysite group=www-data processes=5 threads=1 WSGIProcessGroup project

Je pense que le plus important devrait être threads=1

+0

Il a été mis à 10 mais je l'ai changé à 1 et il n'a pas résolu le problème. Bon point cependant, merci! –

+0

Essayez également de définir les deux processus = 1 et threads = 1 et de voir si le problème disparaît. Notez qu'il ne s'agit que d'un paramètre temporaire pour le débogage, car il limite le nombre de connexions simultanées que votre application Web peut gérer. – pts

+0

Les deux variables étaient déjà définies sur 1. –