异常信息:
刚刚编辑完登录合并购物车的代码,测试时报了500,并抛出异常信息:
AttributeError: 'UserAuthorizeView' object has no attribute 'data'
眼睛一闭就知道是刚才代码写错了。
下面是出错的代码:
class UserAuthorizeView(ObtainJSONWebToken):
# 重写父类post方法,插入合并购物车方法
def post(self, request, *args, **kwargs):
# 继承父类post方法,保证购物车登录功能正常
response = super(UserAuthorizeView, self).post(self, request, *args, **kwargs)
# 取得user
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
user = serializer.object.get('user') or request.user
# 调用合并购物车方法,并用response接收返回值
response = merge_cart_cookie_to_redis(request=request, user=user, response=response)
# 将结果返回
return response
红色标识为出错的地方。
因为所作的是登录合并购物车功能,所以要考虑在用户点击登录时就将两类购物车数据进行合并。但是项目中实现用户登录时使用的时JWT自带的功能模块,所以需要对源码进行继承和重写。
经过头皮发麻的排bug过程,终于在继承的过程中找出了问题。
排bug过程:
异常信息显示该类没有data属性,证明在往序列化器中传参时出现了错误,要么多了,要么少了。而我继承的父类中已明确了所需要的参数信息,所以将目标锁定在第五行。原来是所写的继承语法有问题,删掉self即可。
出错原因:
因为当时继承了ObtainJSONWebToken,并且对父类的post方法进行重写,而父类的post方法中已经写明了参数,所以就一口气复制粘贴,将所有参数都粘贴到super语法中。但是,我忘记了一个致命点,那就是:单继承时,不能将参数全部传递,只能传递父类方法所需的参数,否则会报错。
继承父类并重写的三种方式:
当子类继承父类,重写父类方法后,仍想调用父类方法,有以下三种公式:(1)父类名.同名方法名(self)
(2)super(子类名,self).同名方法名()
(3)是对(2)的简写:super().同名方法名()
super调用:多继承时,可以将所有父类方法执行一次,并且需要将参数全部传递。单继承时,不能将参数全部传递,只能传递父类方法所需的参数,否则会报错。