2016-03-01 70 views
0

我想從不同的模塊由web2py中生成的HTML,這樣我就可以把它變成一個PDF文件:如何從外部模塊調用web2py url?

html = response.render('path/myview.html', context_dict) 

我在我的文件的頂部包含在此

sys.path.append('/home/www-data/web2py') 
from gluon import * 

不過,我仍然得到: NameError: global name 'response' is not defined

也許有做到這一點我沒有想到的更簡單的方法?

+0

Add response = current.response。我不知道這是否正確,但它對我有用。 –

+0

'response'是web2py在響應HTTP請求時創建的環境中可用的對象 - 它不從膠子中導出。您可以運行'gluon.template.render'函數,向其傳遞要呈現的模板的路徑,應用程序視圖文件夾的路徑(以防您的模板擴展或包含任何其他視圖)以及上下文字典。但是,如果您的模板(或其擴展/包含的任何模板)包含對任何其他web2py全局變量(例如,HTML幫助器等)的引用,這仍然不起作用。 – Anthony

+0

或者,您可以在web2py應用程序(可以訪問所有web2py環境對象)的上下文中運行外部模塊,也可以構建web2py環境並將其包含在傳遞給「render」的上下文中。這取決於你想要做什麼,很難說不知道更多。 – Anthony

回答

1

可以執行使用gluon.template.render功能web2py的模板,但如果模板被設計成一個的web2py應用程序中執行的,它可以包括(一些web2py的環境對象的引用例如,HTML幫助對象,該T翻譯對象時, requestresponse對象等),當調用web2py HTTP請求之外的render函數時,該對象將不可用。

如果模板的正確執行需要一個web2py的環境中,你可以使用gluon.shell.env功能建立一個:

import os 
    import gluon.shell 

    context_dict = {...} # The context to be passed to the template. 

    app = 'myapp' 
    app_path = os.path.join(os.path.dirname(os.path.abspath(gluon.shell.__file__)), 
          '..', '..', 'applications', app) 
    w2p_env = gluon.shell.env(app, dir=app_path, import_models=True) 
    context_dict.update(**w2p_env) # Update context with web2py environment objects. 
    response = w2p_env['response'] 
    html = response.render(os.path.join(app_path, 'views', 'mycontroller', 'myview.html'), 
          context=context_dict) 

gluon.shell.env返回一個包含所有web2py的執行環境中的對象的字典。如果import_models=True與上面的代碼一樣,它也將執行應用程序的模型(因此,模型中定義的任何對象也將包含在返回的字典中)。

通過使用完整的web2py執行環境更新context_dict,我們確保模板中引用的任何web2py對象(以及它擴展或包含的任何模板)都可用。

w2p_env環境還包含response對象,因此我們可以使用response.render方法來呈現模板。或者,如上所述,我們可以使用gluon.template.render函數。

的另一種方法是簡單地在你的web2py應用程序的環境中運行你的Python腳本:

python web2py.py -S myapp -M -R '/path/to/myscript.py' 

通過這種方法,myscript.py可以參考任何web2py的環境中的對象,這將是從內應用程序代碼(無需導入任何內容或顯式構建web2py環境)。

此外,請注意,如果您不需要運行應用程序的模型,則可以排除-M

0

我能夠通過將我的python腳本添加到web2py「模塊」文件夾中來實現它。這樣做之後,我不得不修改所引用的「模塊」目錄中的其他文件我的import語句:

from applications.myapp.modules.mymodule import mystuff from gluon import *

html = current.response.render('myview.html', context_dict)

然後從我使用的命令行運行

python /home/www-data/web2py/web2py.py -S myapp -R 'path/to/myscript.py'正如Anthony所描述的那樣

我打算在cron作業完成後調用這個模塊。我假設web2py cron將使用web2py環境,它不需要我用來測試的相同執行腳本。