【问题标题】:Reraising an exception as an HTTP error in Pyramid在 Pyramid 中将异常重新引发为 HTTP 错误
【发布时间】:2015-03-25 02:18:04
【问题描述】:

我在 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 建立了联系,它适用于其他视图。

有谁知道如何解决这个问题,或者如何以不同的方式在 Pyramid 中“链接”异常?

【问题讨论】:

  • 你看过 Pyramid 的exception views 吗?我已经使用它们来捕获和返回特定错误,尽管我在这样做时没有遇到授权错误。

标签: python http pyramid wsgi


【解决方案1】:

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

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

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)

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2016-03-18
    • 2020-07-14
    相关资源
    最近更新 更多