关于在Web2Py中实现自定义错误页面的一些疑问

2 投票
1 回答
642 浏览
提问于 2025-04-15 20:04

我正在尝试为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)

我有一些疑问 -

  1. /modules目录是放这种可重用组件的好地方吗?

  2. /modules目录中的模块在创建新的web2py实例时会自动加载吗?如果是的话,我该如何在控制器中访问它们?

  3. 有没有办法从我的控制器将请求对象传递给这个装饰器?欢迎提供提示。

我当前的onerror.py - http://paste.pocoo.org/show/186165/ 我在控制器中尝试使用的方式 - http://paste.pocoo.org/show/186167/

如果我这样做不太明显,请告诉我。

1 个回答

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模块。你必须导入它们才能使用。

  1. 有没有办法从我的控制器将请求对象传递给这个装饰器?欢迎提供提示。

你需要一个元装饰器 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。那里有一个简单的方法可以实现你想要的。

撰写回答