在独立应用程序中使用 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
,您也只能使用它一次来生成元数据文件(否则,它将不必要地在每个 运行 上生成相同的文件集)。
我正在尝试创建一个脚本,它将利用 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
,您也只能使用它一次来生成元数据文件(否则,它将不必要地在每个 运行 上生成相同的文件集)。