Как поймать OperationFailure из MongoDB и PyMongo в Python - PullRequest
6 голосов
/ 09 августа 2010

У меня возникла проблема, когда после того, как мое соединение mongodb с mongohq через pymongo некоторое время простаивает (без запросов), оно истекает.Это нормально, но соединение с базой данных создается только при запуске приложения Django.Похоже, что он восстанавливает соединение в порядке, но затем необходимо повторно подтвердить подлинность.Когда соединение прервалось и повторно подключилось, и запрос попытался выполнить, он вызывает OperationFailure и следующее исключительное значение database error: unauthorized for db [shanereustle] lock type: -1, которое говорит мне, что это повторное соединение, но не аутентификация.Я импортировал OperationFailure из pymongo.errors и пытался использовать следующую попытку ... за исключением того, что, похоже, я не могу уловить ошибку и выполнить аутентификацию.

try:
    db.mongohq.shanereustle.blog.find()
except OperationFailure:
    db.authenticate() #this function reauthenticates the existing connection

Но по какой-то причинеэто не ловит.Если вместо этого кода я просто запускаю db.authenticate () перед запросом, он будет проходить повторную проверку подлинности и работать нормально, но я не хочу повторной проверки подлинности при каждом запросе.Другие предложения о правильных способах сделать это очень приветствуются, и я ценю помощь.

Спасибо!

1 Ответ

6 голосов
/ 09 августа 2010

Можете ли вы попробовать find_one () вместо find ().Последний не выполняет итерацию курсора автоматически.

Я только что попробовал это с базой данных --auth, и это сработало:

try:
  connection.test.foo.find_one()
except pymongo.errors.OperationFailure:
  print "caught"
...