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

AttributeError when using DAL and Auth in standalone application

我正在尝试创建一个脚本,它将利用 web2py DAL 访问远程数据库。我希望该应用程序能够访问另一个 web2py 应用程序的身份验证 table。脚本如下:

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'

在单机环境下有没有合理的方法解决上述错误?谢谢。

Auth 不适合在 web2py 环境之外使用。如果您只需要访问 auth_user table,最简单的选择可能是在您的代码中明确定义它。可以找到正确的定义 in the book(请注意,如果您不进行任何表单提交,则无需费心定义验证器)。

如果您可以将 DAL 指向应用程序的 /databases 文件夹,您甚至可以跳过明确的 table 定义(如果应用程序在远程服务器上,也许您可​​以挂载远程文件夹,但本地计算机上的副本会快得多)。您的 DAL 设置如下所示(如 here 所述):

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

以上将根据 /path/to/app/databases 中的迁移元数据文件创建 table 定义。请注意,在这种情况下,定义将不包括任何 web2py 特定属性,例如字段验证器(它将仅包括数据库所需的属性,例如字段名称和类型以及数据库约束)。

最后,根据您 运行 编写代码的方式,可以在您的应用程序环境中执行它(您需要应用程序的本地副本):

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

上面会创建一个web2py执行环境,运行你应用的模型文件(里面会定义你的数据库table,包括Authtable),然后执行您在该上下文中的代码。在这种情况下,您无需费心处理任何 table 定义或 auto_import,因为 table 定义将来自您的应用程序代码。

顺便说一句,请注意,您应该在远程连接到应用程序的数据库时禁用迁移(假设您不希望您的代码导致 DAL 对数据库架构进行更改):

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

在这种情况下,不需要 fake_migrate_all=True -- 仅当您启用了迁移并需要生成迁移元数据文件时才有必要。另请注意,即使您确实需要使用 fake_migrate_all,您也只能使用它一次来生成元数据文件(否则,它将不必要地在每个 运行 上生成相同的文件集)。