我试图从其他模块获取web2py生成的html,因此我可以将其转换为pdf文件:
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 :(得分:1)
您可以使用gluon.template.render
函数执行web2py模板,但如果模板设计为在web2py应用程序中执行,则可能包含对某些web2py环境对象的引用(例如,HTML帮助程序对象,{{ 1}}转换对象,T
和request
对象等),在web2py HTTP请求之外调用response
函数时不可用。
如果正确执行模板需要web2py环境,您可以使用render
函数构建一个:
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)
返回包含所有web2py执行环境对象的字典。如果gluon.shell.env
,如上面的代码,它也将执行应用程序的模型(因此,模型中定义的任何对象也将包含在返回的字典中)。
通过使用完整的web2py执行环境更新import_models=True
,我们确保模板中引用的任何web2py对象(以及它扩展或包含的任何模板)都可用。
context_dict
环境还包含w2p_env
对象,因此我们可以使用response
方法呈现模板。或者,如上所述,我们可以使用response.render
函数。
另一种方法是在web2py应用程序的环境中运行Python脚本:
gluon.template.render
使用这种方法,myscript.py可以引用应用程序代码中可用的任何web2py环境对象(无需导入任何内容或显式构建web2py环境)。
另请注意,如果您不需要运行应用程序的模型,则可以排除python web2py.py -S myapp -M -R '/path/to/myscript.py'
。
答案 1 :(得分:0)
我能够通过将我的python脚本添加到web2py" modules"来实现它的工作。夹。执行此操作后,我不得不修改引用其他文件的导入语句,这些文件引用了" modules"目录:
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'
如安东尼所述
我计划在完成后通过cron作业调用此模块。我假设web2py cron将使用web2py环境,它不会需要我用来测试的相同执行脚本。