2016-02-15 2 views
3

Большинство сообщений в блоге и примеры в Интернете, в целях подключения к MongoDB с использованием Mongoengine в Python/Django, предложили добавить эти строки в settings.py файл приложения:Взятие mongoengine.connect из настройки.py в django

from mongoengine import connect 
connect('project1', host='localhost') 

Он отлично работает для большинства случаев, кроме одного я столкнулся в последнее время: Когда база данных вниз!

Позвольте сказать, что если db опускается, процесс, который заботится о веб-сервере (в моем случае, Supervisord), прекратит запуск приложения из-за исключения, которое connect выбрасывает. Он может попробовать несколько раз, но после достижения таймаута он перестанет пытаться.

Так что, даже если ваше приложение имеет некоторые части, которые не привязаны к db, они также сломаются.

Быстрое решение этой проблемы является добавление блока попытка/исключение в код подключения:

try: 
    connect('project1', host='localhost') 
except Exception as e: 
    print(e) 

, но я ищу для лучшего и чистым способом, чтобы справиться с этим.

ответ

1

К сожалению, это невозможно сделать с mongoengine, если вы не идете с решением try-except, как вы.

Вы могли бы попытаться связаться с чистой pymongo версии 3.0+, используя MongoClient и регистрирующий соединение вручную в mongoengine.connection._connection_settings словаре (вполне Hacky, но должен работать). От pymongo documentation:

Изменено в версии 3.0: MongoClient теперь один и единственный класс, клиент для автономного сервера, mongos или набора реплик. Он включает в себя функции, которые были разделены на MongoReplicaSetClient: он может подключаться к набору реплик, обнаруживать всех его членов и контролировать набор для отступов, выборов и реконфигурации.

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

+0

FYI, mongoengine предоставляет метод для [регистрации соединения] (http://docs.mongoengine.org/en/latest/apireference.html#mongoengine.register_connection). Но я все еще смущен тем, как и где я должен подключиться к db в этом сценарии (используя pymongo или mongoengine)? Должен ли я писать промежуточное ПО? : -/ – Rahman

+0

Да, но я не уверен, сможешь ли ты его использовать. Как подключиться - используйте 'pymongo' и зарегистрируйте соединение с' mongoengine'. Что касается того, где, как правило, при запуске приложения, определенные настройки не подходят для него, но я не эксперт по django, поэтому вы можете задать отдельный вопрос для этого. – matino