关于在Web2Py中实现自定义错误页面的一些疑问
我正在尝试为web2py实现一个装饰器,用于自定义错误页面,这是海地的一个待办事项。参考链接 - http://web2py.com/AlterEgo/default/show/75
我想把它放在/modules目录下,方便在控制器中导入,并适当地使用这个装饰器。
我把错误处理的装饰器放在了/modules/onerror.py里。
然后我在控制器中这样导入它,比如说在(or.py)中 -
exec('from applications.%s.modules.onerror import onerror as onerror'
% request.application)
在onerror.py中没有HTTP对象,所以我做了 -
from gluon.http import *
但后来我意识到请求对象在装饰器中也不可用,就像这一行 -
filename=os.path.join(request.folder,'views/errors/error%i.html'%status)
我有一些疑问 -
/modules目录是放这种可重用组件的好地方吗?
/modules目录中的模块在创建新的web2py实例时会自动加载吗?如果是的话,我该如何在控制器中访问它们?
有没有办法从我的控制器将请求对象传递给这个装饰器?欢迎提供提示。
我当前的onerror.py - http://paste.pocoo.org/show/186165/ 我在控制器中尝试使用的方式 - http://paste.pocoo.org/show/186167/
如果我这样做不太明显,请告诉我。
1 个回答
这个问题在web2py用户邮件列表上已经解决了。
你也可以使用: onerror = load_import('onerror').onerror
在onerror.py中没有HTTP对象,所以我做了一个 - from gluon.http import *
在web2py中,Python模块和普通的Python模块一样。除非你导入它们,否则它们只会看到Python的关键字。web2py有5个特别的对象(request、response、session、cache、T),而你的应用还有其他的(db、auth、crud)。因为这些对象在每次请求时都会被创建,所以不能通过模块导入它们,必须明确地传递给模块中的函数。虽然这样有点麻烦,但其他框架通常也要求这样做。web2py为模型和控制器简化了这个过程。
但我意识到请求对象在装饰器中也不可用,比如这一行 - filename=os.path.join(request.folder,'views/errors/error %i.html'%status) 我有一些疑问 - 1. /modules目录中的模块在创建新的web2py实例时会自动加载吗?如果是的话,我该如何访问它们?
不会。它们是普通的Python模块。你必须导入它们才能使用。
- 有没有办法从我的控制器将请求对象传递给这个装饰器?欢迎提供提示。
你需要一个元装饰器 def meta_decoration(something): def actual_decorator(f,something=something): do_whatever_you_want() return f() return decorator @meta_decorator(request) def function_to_be_decorated(): return dict() 不过你其实不需要这个装饰器。可以看看routes.examples.py中的routes_onerror。那里有一个简单的方法可以实现你想要的。