对于维护杂务,我想在web2py之外调用define_tables。这可以做到吗?我可以这样做:如何从外部web2py使用define_tables
from gluon.tools import Auth
from pydal import DAL
db = DAL(...)
auth = Auth(db)
auth.define_tables()
我认为不是,因为Auth需要访问注册控制器太...是否有替代方法呢?
对于维护杂务,我想在web2py之外调用define_tables。这可以做到吗?我可以这样做:如何从外部web2py使用define_tables
from gluon.tools import Auth
from pydal import DAL
db = DAL(...)
auth = Auth(db)
auth.define_tables()
我认为不是,因为Auth需要访问注册控制器太...是否有替代方法呢?
你会遇到的问题不是缺少控制器的验证行动,但Auth
初始化需要request
和session
对象(连接到current
对象),你将不得不嘲笑(这是可行的,但其他解决方案可能更简单)。
db = DAL(...,folder='path/to/app/databases', auto_import=True)
以上会自动定义都基于数据库的表款:
如果必须的web2py应用程序上下文之外完全运行的代码,你可能会与DAL auto import功能度日元数据存储在迁移文件中。但是,表定义将缺少许多web2py特有的属性,例如字段验证器,标签等(元数据文件仅包含管理数据库迁移所需的信息,例如字段名称和类型,约束等) 。根据你需要用Auth表格做什么,这对你来说可能就足够了。
或者,您可以考虑在相关的web2py应用程序的上下文中运行Python代码。有几种方法可以实现这一点。
首先,你可以使用的web2py command line选项来运行Python脚本:
>> python web2py.py -S myapp -M -R /path/to/script.py
以上会产生web2py的环境中,运行应用程序的模型,然后在该环境中(所以auth
执行脚本, db
和Auth
表定义将全部可供脚本使用)。其次,您可以将代码放在应用程序中的控制器或模块中,然后调用控制器中的特定操作以触发代码运行。您可以通过浏览器界面或通过编程调用使用curl或从另一个Python脚本运行该操作。
最后,您可以使用web2py scheduler在应用程序上下文中运行一次性或周期性任务(大部分代码可以放入导入的模块中)。
请注意,对于需要访问web2py应用程序环境的模块中的代码,请参阅有关使用current
object的文档。
谢谢安东尼,我会试试这个。 – dangonfast
有没有什么方法可以确定我是在普通的web2py环境中运行,还是使用'-R脚本'运行?在我的db.py中,我有一个重定向,我必须在调用脚本时禁用它(否则会引发异常,如果我理解正确的话,则是交付重定向的标准方式) – dangonfast
有'request.is_shell'来确定何时运行shell或脚本,但目前有一个错误阻止它正常工作。作为一种解决方法,您可以执行request.global_settings。cmd_options.shell不是None。 – Anthony
你到底需要做什么?是否绝对有必要在web2py的上下文之外运行代码,或者(a)使用web2py调度程序来运行任务,(b)通过shell命令运行Python脚本,或者(c)创建一个控制器(可以通过程序访问)来运行维护任务? – Anthony