2015-08-08 37 views
1

对于维护杂务,我想在web2py之外调用define_tables。这可以做到吗?我可以这样做:如何从外部web2py使用define_tables

from gluon.tools import Auth 
from pydal import DAL 

db = DAL(...) 
auth = Auth(db) 
auth.define_tables() 

我认为不是,因为Auth需要访问注册控制器太...是否有替代方法呢?

+0

你到底需要做什么?是否绝对有必要在web2py的上下文之外运行代码,或者(a)使用web2py调度程序来运行任务,(b)通过shell命令运行Python脚本,或者(c)创建一个控制器(可以通过程序访问)来运行维护任务? – Anthony

回答

1

你会遇到的问题不是缺少控制器的验证行动,但Auth初始化需要requestsession对象(连接到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执行脚本, dbAuth表定义将全部可供脚本使用)。其次,您可以将代码放在应用程序中的控制器或模块中,然后调用控制器中的特定操作以触发代码运行。您可以通过浏览器界面或通过编程调用使用curl或从另一个Python脚本运行该操作。

最后,您可以使用web2py scheduler在应用程序上下文中运行一次性或周期性任务(大部分代码可以放入导入的模块中)。

请注意,对于需要访问web2py应用程序环境的模块中的代码,请参阅有关使用current object的文档。

+0

谢谢安东尼,我会试试这个。 – dangonfast

+0

有没有什么方法可以确定我是在普通的web2py环境中运行,还是使用'-R脚本'运行?在我的db.py中,我有一个重定向,我必须在调用脚本时禁用它(否则会引发异常,如果我理解正确的话,则是交付重定向的标准方式) – dangonfast

+0

有'request.is_shell'来确定何时运行shell或脚本,但目前有一个错误阻止它正常工作。作为一种解决方法,您可以执行request.global_settings。cmd_options.shell不是None。 – Anthony