如何从外部模块调用web2py网址?

时间:2016-03-01 01:13:11

标签: python web2py

我试图从其他模块获取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

也许有一种更简单的方法可以做到这一点我还没想过?

2 个答案:

答案 0 :(得分:1)

您可以使用gluon.template.render函数执行web2py模板,但如果模板设计为在web2py应用程序中执行,则可能包含对某些web2py环境对象的引用(例如,HTML帮助程序对象,{{ 1}}转换对象,Trequest对象等),在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环境,它不会需要我用来测试的相同执行脚本。