在金字塔中将异常重新添加为HTTP错误

时间:2015-01-26 16:12:11

标签: python http pyramid wsgi

我在python Pyramid中有一个web应用程序,它调用python中的各种其他代码,可能引发异常。 我不希望用户收到" 500内部错误",而是希望他们获得更具体的错误,例如,如果抛出 MyException ,则显示503错误。我试着这样做:

@view_config(context=MyException, permission='view')
def custom_exc(exc, request):
   raise HTTPServiceUnavailable(exc.message)

然而,这失败了,因为它出于某种原因未经授权:

HTTPForbidden: Unauthorized: custom_exc failed permission check

我的ACL如下:

class RootFactory(object):
    __acl__ = [
        (Allow, 'admin', ('view',))
        ]

我与用户 admin 建立了联系,它可以完美地用于其他视图。

有没有人知道如何解决这个问题,或者如何解决这个问题?" chain"金字塔中的异常以不同的方式出现?

1 个答案:

答案 0 :(得分:2)

customized version of famous ToDoPyramid example application学习。这样,我将内部技术事件(数据库异常)转换为自定义异常视图代码中的有意义的特定于应用程序的消息。有些人称这是一层抽象或信息隐藏。

不要使用权限保护这些异常视图,因为您应该保护执行操作的代码并且CAN引发异常。

from sqlalchemy.exc import OperationalError as SqlAlchemyOperationalError

@view_config(context=SqlAlchemyOperationalError)
def failed_sqlalchemy(exception, request):
    """catch missing database, logout and redirect to homepage, add flash message with error
    implementation inspired by pylons group message
    https://groups.google.com/d/msg/pylons-discuss/BUtbPrXizP4/0JhqB2MuoL4J
    """

    msg = 'There was an error connecting to database'
    request.session.flash(msg, queue='error')
    headers = forget(request)
    # Send the user back home, everything else is protected
    return HTTPFound(request.route_url('home'), headers=headers)