在 Pyramid 中将异常重新引发为 HTTP 错误
Reraising an exception as an HTTP error in Pyramid
我在 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" Pyramid 中的异常?
向 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)
我在 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" Pyramid 中的异常?
向 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)