题
我试图根据海地托多斯之一实现Web2py自定义错误页面的装饰器。参考-http://web2py.com/AlterEgo/default/show/75
我正在尝试将其作为 /模块目录中的模块保存,以便可以将其导入控制器并适当地放置。
我一直将错误处理装饰符为 /modules /onerror.py
并像这样从控制器导入它(or.py)-
exec('from applications.%s.modules.onerror import onerror as onerror'
% request.application)
HTTP 对象在 onerror.py 中不可用,所以我做了 -
from gluon.http import *
但是后来我读到,装饰器也无法像线路一样可用。
filename=os.path.join(request.folder,'views/errors/error%i.html'%status)
我有些疑惑 -
/modules 目录是保存此类可重用组件的好地方吗?
/模块目录中的模块是否会自动加载为新的Web2Py实例?如果是这样,我该如何在控制器中访问它们?
有没有办法将请求对象从控制器传递给该装饰器?欢迎提示。
我当前的 onerror.py - http://paste.pocoo.org/show/186165/我尝试在控制器中使用的方式 - http://paste.pocoo.org/show/186167/
如果我以一种不明显的方式这样做,请告诉我。
解决方案
解决了 通过 web2py 用户邮件列表。
您还可以使用:onerror = load_import('onerror').onerror
onerror.py中没有http对象,所以我从gluon.http import *做了一个 -
python 模块也是 web2py 中的普通 python 模块。除非您导入它们,否则他们只会看到Python关键字。Web2py有5个特殊对象(请求,响应,会话,缓存,T),并且您的应用程序具有其他对象(DB,Auth,Crud)。因为它们是根据每个请求实例化的,所以它们不能通过模块导入,因此必须将它们明确传递给模块中的函数。请注意,虽然这很尴尬,但这是其他框架一直要求为所有功能做的事情。Web2py为模型和控制器节省了此功能。
但是后来我意识到,Decorator也无法像在行-filename = os.path.join(request.folder,'views/errors/error/error%i.html'%状态)中那样,请求对象也无法使用。 -1。/模块目录中的模块是否会自动加载为新的Web2Py实例?如果是这样我怎样才能访问它们?
不。它们是普通的 python 模块。您必须导入它们才能使用它们。
- 有没有办法将请求对象从控制器传递给该装饰器?欢迎提示。
你需要一个元装饰器 def meta_decoration(something):def实际装饰器(f,某物=某物):do_whatey_you_want()return f()返回装饰器@meta_decorator(请求)def function_to_to_be_decorated():无论如何,返回dict()您不需要此装饰器。查看routes.examples.py 中的routes_onerror。有一种简单的方法可以做您想做的事情。