2012-06-13 2 views
3

Я создаю экземпляр соединения перед началом примененияПочему я не могу разделить экземпляр соединения PyMongo в моем bottlepy приложения

# app.py 
mongodb_conn = pymongo.Connection(host=host, port=int(port), safe=True) 

print(mongodb_conn) # Connection('127.0.0.1', 27017) 

... 

bottle.run(...) 

Но, то в моих запросах, когда я пытаюсь открыть соединение с другие модули, он заблуждается говоря, что mongodb_conn является None

# user.py 
from app import mongodb_conn 
... 

db = mongodb_conn['somedb'] # TypeError: 'NoneType' object is not subscriptable 

Может кто-нибудь объяснить, что происходит?

ответ

1

Хорошо, я смог решить проблему. Это было связано с некоторыми расхождениями в загрузках модулей.

Но, вполне нормально кэшировать один экземпляр подключения, а затем использовать его на протяжении всего срока службы приложения. И это верно даже для резьбовых приложений.

+0

Я думаю, что это завершает [ваш другой вопрос] (http://stackoverflow.com/questions/10968489/pymongo-connection-pooling-and -клиент-запросы) тоже? – jdi

+0

Да в значительной степени – treecoder

1

Я знаю, что вы уже упомянули в своем ответе, что решили его из-за проблемы с порядком модуля, но я хотел включить расширенный ответ.

Не видя больше своего кода, я предполагаю, что вы настраиваете некоторый циклический импорт, где соединение определено в вашем app.py, которое, вероятно, также импортирует ваш user.py, но затем ваше приложение импорта user.py .py для объектов соединения. mongodb_conn, скорее всего, не связан с этой точкой.

Что я рекомендую, так это то, что вы создаете третий модуль под названием db.py. Создайте там глобальное переменное соединение или создайте простой одноэлементный класс, который всегда возвращает одно и то же соединение, или простую функцию, такую ​​как getConnection(), которая всегда возвращает глобальное соединение. Таким образом, у вас не будет кругового импорта, и любой другой модуль может импортировать db

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