0

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

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'

有没有一种合理的方法可以在独立环境中解决上述错误?谢谢你。

4

1 回答 1

1

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

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

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,您也只会使用它一次来生成元数据文件(否则,它会在每次运行时不必要地生成相同的文件集)。

于 2016-10-10T13:54:25.817 回答