web2py выполняет файлы модели, контроллера и просмотра в подготовленной среде (которая создается заново при каждом HTTP-запросе).Объекты, определенные в файлах модели (включая объект db
), добавляются в эту среду и поэтому доступны глобально в любом контроллере или представлении.Однако модули, импортированные в контроллеры, работают так же, как и любой другой модуль Python - они не выполняются в среде web2py, и поэтому объекты в среде web2py не доступны глобально в импортируемых модулях.
В этом случаеУ вас есть пара вариантов.Во-первых, вы можете просто передать объект db
в функцию в качестве аргумента:
В модуле:
def my_method(db):
В контроллере:
my_module.my_method(db)
В качестве альтернативы вы можете добавить объект db
к объекту current
и импортировать current
в модуль (как описано здесь ):
В модели:
from gluon import current
current.db = db
В вашем модуле:
from gluon import current
def my_method():
db = current.db # Keep this inside the function, not at the top level of the module.
Наконец, обратите внимание, что вы также можете получить доступ к любым объектам в среде web2py через словарь current.globalenv
, вместо того, чтобы явно добавлять db
к current
Вы можете просто получить к нему доступ через current.globalenv['db']
.