在独立应用程序中使用DAL和Auth时的AttributeError

时间:2016-10-09 01:09:34

标签: web2py pydal

我正在尝试创建一个脚本,该脚本将利用web2py DAL访问远程数据库。我希望该应用程序可以访问另一个web2py应用程序的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 个答案:

答案 0 :(得分: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。另请注意,即使您确实需要使用Key,您也只能使用它一次生成元数据文件(否则,它会在每次运行时不必要地生成相同的文件集)。