2015-12-12 5 views
1

Я тяну свои волосы, пытаясь заставить pymongo ошибиться, когда код не может подключиться к экземпляру MongoD. Кажется, что независимо от того, что я делаю, «pymongo.errors.ConnectionFailure» не работает. Я пробовал это на локальном хосте и удаленном экземпляре mongoD. Когда я использую оболочку mongoclient («mongo --host xx.xx.xx.xx») из той же системы, я получаю правильное «соединение отказано». Другие исключения работают, но не «ConnectionFailure». Обратите внимание, что когда я запускаю tshark sniffer на экземпляре экземпляра mongod, я вижу, что правильный TCP RST на закрытом порту для отказа соединения. Mongod не слушает, но pymongo ConnectionFailure не может поймать неудавшееся соединение.pymongo 3.2: ConnectionFailure не работает

версия питона: 2.7.10 версия PyMongo: 3,2

Что может отсутствовать, или шаги для устранения неполадок? В этом примере ниже mongod не работает на localhost. Я также останавливаю его на удаленном хосте. В обоих случаях ошибка исключения не попадает, и код pymongo кажется, что он подключен.

Код:

import pymongo 
try: 
    pymongo.MongoClient('localhost:27017') 
except pymongo.errors.ConnectionFailure, e: 
    print "Could not connect: %s" % e 
+0

Можете ли вы подключиться к MongoDB с помощью оболочки 'mongo'? – albert

+0

Нет, ответ отклоняется. – Robert

+0

Итак, сначала вы должны убедиться, что MongoDB работает правильно ... – albert

ответ

0

Первая попытка: Синтаксическая ошибка

Вы получили синтаксическую ошибку в коде. Изменение:

pymongo.MongoClient('localhost':27017) 

в:

pymongo.MongoClient('localhost:27017') 

или что-то вроде этого:

pymongo.MongoClient(host='localhost', port=27017) 

Вы имели одинарную кавычку в неправильном месте.


Работа примера фрагмент кода с помощью Python 3.4.3 и PyMongo 2,9

import pymongo 

try: 
    pymongo.MongoClient('localhost:27017') 
except pymongo.errors.ConnectionFailure as e: 
    print(e) 

После прочтения Pymongo3 migration guide

Я думаю, что такое поведение как хотелось бы, так как guide сообщает:

В PyMongo 3, конструктор MongoClient больше не блокирует, пока не подключения к серверу или серверам, и он больше не поднимает ConnectionFailure, если они недоступны, ни ConfigurationError если учетные данные пользователя являются неправильными. Вместо этого конструктор немедленно возвращает и запускает процесс подключения по потокам фона. Добавлена ​​опция подключения, чтобы контролировать, начинаются ли эти потоки или когда клиент впервые используется.

Как показано в руководстве по миграции что-то вроде это должно работать:

from pymongo.errors import ConnectionFailure 
client = MongoClient(connect=False) 
try: 
    result = client.admin.command("ismaster") 
except ConnectionFailure: 
    print("Server not available") 
+0

Darn, это не исправляет. Хотелось бы. Единственное различие заключается в том, что вы используете Python 3.4.3, и я запускаю 2.7. Вы говорите, что получаете ответ ConnectionFailure, или он подключается? – Robert

+0

Я мог бы подключиться к работающей базе данных на порту 27017 и обрабатывать ConnectionFailure при попытке подключения на порт 12345. – albert

+0

Хорошо, прогресс здесь, но я до сих пор не понимаю. Этот код действительно работает. Кажется, ConnectionFailure работает только для меня, когда я добавляю дескриптор в БД и пытаюсь выполнить аутентификацию. Это работает: – Robert

0

Это, кажется, работает только тогда, когда я добавить еще две строки, чтобы получить базу данных и аутентификации. Я не знаю почему. Должна ли ConnectionFailure улавливать ошибку только при попытке подключения?

try: 
    dbconn = pymongo.MongoClient(host, port) 
    db = dbconn[dbname] 
    success = db.authenticate(user, password) 

except pymongo.errors.ConnectionFailure as msg: 
    print "Failed connection: %s" % str(msg) 

Когда я наблюдаю это с наркоманом на хосте, который не работает mongod, он пытается соединиться в течение 20-30 секунд, а затем PyMongo хост печатает:

«Не удалось установить соединение: хост .db.com: 27017: [Errno 61] Connection failed '

Смежные вопросы