2016-10-09 1 views
0

Я пытаюсь создать скрипт, который будет использовать web2py DAL для доступа к удаленной базе данных. Я хочу, чтобы приложение имело доступ к другой таблице приложений web2py. Сценарий выглядит следующим образом:AttributeError при использовании DAL и Auth в автономном приложении

if MODE == 'server': 
    DIR_GLUON = '...' 
else: 
    DIR_GLUON = '...' 

sys_path.insert(0, DIR_GLUON) 

from gluon import DAL, Field, current 
from gluon.tools import Auth 
from gluon.storage import Storage 
import gluon.contrib.plural_rules as plural_rules 

# establish DB connection  
db = DAL(..., pool_size = 1, check_reserved=['all'], lazy_tables = True, fake_migrate_all = True) 

auth = Auth(db) 

Последняя строка производит следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "standalone_script.py", line 39, in <module> 
    auth = Auth(db) 
    File "C:\...\web2py\gluon\tools.py", line 1754, in __init__ 
    request = current.request 
AttributeError: 'thread._local' object has no attribute 'request' 

Есть ли разумный способ решить данную ошибку в автономной среде? Спасибо.

ответ

1

Auth не предназначен для использования за пределами среды web2py. Если вам просто нужен доступ к таблице auth_user, самым простым вариантом может быть определение его явно в вашем коде. Правильное определение может быть найдено in the book (обратите внимание: вам не нужно будет определять валидаторы, если вы не будете делать какие-либо формы).

Возможно, вы даже можете пропустить явное определение таблицы, если вы можете указать DAL в папку приложения /databases (если приложение находится на удаленном сервере, возможно, вы можете установить удаленную папку, хотя копия на локальном машина будет намного быстрее). Ваша установка DAL будет выглядеть следующим образом (как описано here):

db = DAL(..., folder='/path/to/app/databases', auto_import=True) 

выше будет создавать определения таблиц на основе файлов метаданных миграции в /path/to/app/databases. Обратите внимание, что в этом случае определения не будут содержать никаких специфических атрибутов web2py, таких как проверки полей (они будут включать только атрибуты, необходимые базе данных, такие как имена полей и типы, а также ограничения базы данных).

Наконец, в зависимости от того, как вы используете свой код, то можно выполнить его в среде приложения (вам потребуется локальная копия приложения):

python web2py.py -S yourapp -M -R /path/to/your/script.py 

выше будет создайте среду выполнения web2py, запустите файлы модели приложения (которые будут определять ваши таблицы базы данных, включая таблицы Auth), а затем выполните ваш код в этом контексте. В этом случае вам не нужно беспокоиться о каких-либо определениях таблиц или auto_import, поскольку определения таблиц будут получены из вашего кода приложения.

Как в сторону, примечание, вы, вероятно, следует отключить миграции при подключении к базе данных приложения удаленно (если вы не хотите, чтобы ваш код в результате изменения DAL внесении в схему базы данных):

db = DAL(..., migrate_enabled=False) 

В этом случае нет необходимости в fake_migrate_all=True - это необходимо только в том случае, если вы включили миграции и вам необходимо создать файлы метаданных миграции. Также обратите внимание, что даже если вам нужно было использовать fake_migrate_all, вы использовали бы его только один раз для генерации файлов метаданных (в противном случае он будет излишне генерировать один и тот же набор файлов при каждом запуске).

+0

Спасибо, Энтони. В конечном итоге я пошел с опцией определения таблиц явно в сценарии, с отключенной миграцией, но я, конечно, узнал некоторые новые вещи из вашего поста! – Boa

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