2

我正在尝试根据 haiti Todos 之一在 web2py 中为自定义错误页面实现装饰器。参考 - http://web2py.com/AlterEgo/default/show/75

我试图将它作为一个模块保存在 /modules 目录中,以便我可以将它导入控制器并适当地放置装饰器。

我将错误处理装饰器保留为 /modules/onerror.py

并像这样从控制器说(或.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)

我有些疑惑 -

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

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

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

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

让我知道我是否以不明显的方式这样做。

4

1 回答 1

1

通过 web2py 用户邮件列表解决。

你也可以使用:onerror = load_import('onerror').onerror

HTTP 对象在 onerror.py 中不可用,所以我做了一个 - from gluon.http import *

python 模块也是 web2py 中的普通 python 模块。除非您导入它们,否则它们只会看到 python 关键字。web2py 有 5 个特殊对象(请求、响应、会话、缓存、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。有一种简单的方法可以做你想做的事。

于 2010-03-10T18:11:23.533 回答