2015-08-08 32 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