Después de luchar con diferentes cosas aquí y allá, finalmente pude obtener BottlePY corriendo en Apache y ejecutar un sitio con MongoDB. Estoy acostumbrado a ejecutar aplicaciones de Django, así que me relacionaré un poco con mi pregunta.¿Por qué mi conexión MongoDB remota requiere autenticación en cada consulta?
El problema
Cada vez que una página se carga a través BottlePY, la conexión a la base de datos MongoDB situado en MongoHQ.com tiene que volver a autenticar (lo que significa que probablemente tuvo que volver a conectar).
lo que encontré
Os adjunto una función db.keep_alive()
a la parte superior de cada función del modelo, por lo que antes de ejecutar cualquier consulta mongodb, trys para ejecutar una consulta simple. Si falla, detecta los errores OperationFailure o AutoReconnect y luego llama a la función db.authenticate()
. Después de volver a autenticarlo, lo agrego a un registro de db para controlar la frecuencia con que debe volver a autenticarse. Actualmente, necesita volver a autenticarse en cada carga de página (que requiere ejecutar una consulta). Esto no es correcto
Diferencia de Django
que usan este mismo concepto en Django, y han encontrado que la conexión db sólo necesita ser autenticado después de 10-15 minutos de consultas no se está ejecutando.
No entiendo por qué crear una conexión de pymongo en django sería diferente de crear uno en botella, ya que estoy usando el mismo controlador, funciones y métodos. No estoy usando ORMS ni nada de eso tampoco.
Versiones
- Botella: 0.9.dev
- Django: 1.2.1 definitiva
- PyMongo: 1,8
Agradezco la ayuda!
Actualización: Un amigo pudo echar un vistazo rápido y notó lo siguiente que puede ayudar a responder mi pregunta.
Parece que cada solicitud es el lanzamiento de un nuevo proceso de Python, como oposición a Django, en el que un solo proceso permanece funcionando durante un largo período de tiempo .
Tiene que autenticarse tantas veces como sea el número de sus procesos de trabajo. No puede reutilizar conexiones de base de datos entre procesos. De modo que lo primero que debe resolver en su marco (independientemente de MongoDB) es que hay pocos procesos (en un grupo de trabajadores) en su marco que atienda sus solicitudes. os.getpid() debería devolver solo algunos valores disjuntos. – pts
¿cómo ejecutas tu python dentro de apache: a través de mod_python o wsgi? –
@pts ¡Gracias! Estoy investigando esto. @ ralf.w. WSGI en Apache2 –