我试图根据海地托多斯之一实现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)

我有些疑惑 -

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

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

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

我当前的 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 模块。您必须导入它们才能使用它们。

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

你需要一个元装饰器 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。有一种简单的方法可以做您想做的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top