django rest-framework里的异常处理上下文

django rest-framework里的异常处理
在rest-framework里的认证过程中:

class APIView(View):
    def perform_authentication(self, request):
        request.user
class Request(object):
    @property
    def user(self):
	        if not hasattr(self, '_user'):
	        with wrap_attributeerrors():
	            self._authenticate()
	    return self._user

在request类的user方法里,先判断了是否有_user属性,然后开启了一个上下文with wrap_attributeerrors()。

@contextmanager
def wrap_attributeerrors():
    try:
        yield
    except AttributeError:
        info = sys.exc_info()
        exc = WrappedAttributeError(str(info[1]))
        six.reraise(type(exc), exc, info[2])

这里的原函数是一个生成器,而with wrap_attributeerrors是一个用contextlib中的contextmanager装饰器装饰的一个上下文管理器,返回的是一个_GeneratorContextManager对象,而这个对象中重写了__enter__和__exit__方法,因此当with wrap_attributeerrors()时,调用的是_GeneratorContextManager中的__enter__,而这个方法里调用了原函数的next()方法,因此相当于启动了该生成器。然后回来执行上下文中的代码,如果出现异常,则会执行_GeneratorContextManager中的__exit__,也就是再执行一次make_context.next()函数,所以先会用自己所定义的异常处理方式来处理异常,然后再处理其他异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值