Nachdem ich hier und da mit verschiedenen Dingen gekämpft habe, konnte ich endlich BottlePY auf Apache laufen lassen und eine von MongoDB betriebene Seite betreiben. Ich bin es gewohnt, Django-Apps zu verwenden, daher werde ich mich in meiner Frage ein wenig damit beschäftigen.Warum erfordert meine MongoDB-Remoteverbindung eine Authentifizierung bei jeder Abfrage?
Das Problem
Jedes Mal, wenn eine Seite über BottlePY geladen ist, muss die Verbindung zum MongoDB-Datenbank auf MongoHQ.com sich erneut authentifiziert werden (was bedeutet es wahrscheinlich wieder musste).
Was ich gefunden
Ich legte eine db.keep_alive()
Funktion an die Spitze jedes Modellfunktion, so dass vor jeder mongodb Abfrage ausgeführt wird, ist es eine einfache Abfrage auszuführen Trys. Wenn dies fehlschlägt, fängt es die Fehler OperationFailure oder AutoReconnect ab und ruft dann die Funktion db.authenticate()
auf. Nachdem es sich erneut authentifiziert hat, muss ich ein Protokoll zu einer Protokolldatenbank hinzufügen, um zu überwachen, wie oft es sich erneut authentifizieren muss. Gegenwärtig muss es sich bei jedem Laden der Seite erneut authentifizieren (das erfordert das Ausführen einer Abfrage). Das ist nicht richtig.
Unterschied von Django
Ich benutze dieses gleiche Konzept in django, und haben festgestellt, dass die DB-Verbindung muss erst nach 10 bis 15 Minuten von nicht-Abfragen authentifiziert werden gestartet wird.
Ich verstehe nicht, warum das Erstellen einer Pymongo-Verbindung in Django wäre anders als die Erstellung einer in der Flasche, da ich den gleichen Treiber, Funktionen und Methoden verwende. Ich benutze auch keine ORMS oder ähnliches.
Versionen
- Flasche: 0.9.dev
- Django: 1.2.1 final
- PyMongo: 1,8
Ich schätze die Hilfe!
Update: Ein Freund war in der Lage, einen kurzen Blick zu werfen und bemerkte die folgenden, die bei der Beantwortung meiner Frage helfen können.
Es scheint, dass jede Anfrage ist ein neues Python-Prozess, wie Gegensatz zu Django, in dem ein einzelner Prozess bleibt läuft für eine lange Zeit starten.
Sie müssen sich so oft authentifizieren wie die Anzahl Ihrer Arbeitsprozesse. Sie können Datenbankverbindungen nicht über Prozesse hinweg wiederverwenden. Der erste Gedanke, den Sie in Ihrem Framework lösen müssen (unabhängig von MongoDB), besteht darin, dass nur wenige Prozesse (in einem Worker-Pool) in Ihrem Framework Ihre Anforderungen erfüllen. os.getpid() sollte nur einige disjunkte Werte zurückgeben. – pts
Wie läuft Ihr Python in Apache: über mod_python oder wsgi? –
@pts Danke! Ich untersuche das. @ ralf.w. WSGI auf Apache2 –