我正在尝试创建一个脚本,该脚本将利用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'
在独立环境中是否有合理的方法来解决上述错误?谢谢。
答案 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
,您也只能使用它一次生成元数据文件(否则,它会在每次运行时不必要地生成相同的文件集)。