2010-08-11 12 views
6

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.

+0

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

+0

Wie läuft Ihr Python in Apache: über mod_python oder wsgi? –

+0

@pts Danke! Ich untersuche das. @ ralf.w. WSGI auf Apache2 –

Antwort

1

Dies ist nur eine seltsame Sache zwischen Flasche und MongoHQ sein endete.Es wurde keine echte Lösung gefunden, aber ich konnte sie nicht mit anderen Frameworks wiederherstellen. Irgendwelche anderen Ideen werden geschätzt.

0

hat Ihr Apache xxx.conf wie etwas enthalten:

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

Ich denke, am wichtigsten sein sollte threads=1

+0

Es wurde auf 10 gesetzt, aber ich änderte es auf 1 und es hat das Problem nicht gelöst. Guter Punkt, aber danke! –

+0

Versuchen Sie auch, beide Prozesse = 1 und Threads = 1 und sehen, ob das Problem verschwindet. Beachten Sie, dass dies nur eine temporäre Einstellung für das Debugging sein sollte, da es die Anzahl der gleichzeitigen Verbindungen beschränkt, die Ihre Webanwendung verarbeiten kann. – pts

+0

Beide Variablen wurden bereits auf 1 gesetzt. –