python调用flask接口实例化_Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错...

本文通过一个错误实例解释了在Python中直接修改类的列表属性如何影响Flask接口的多次请求,导致错误。解决方案是使用列表副本避免直接影响原始对象。在Flask中,每个请求都会生成新的应用上下文,而对应用上下文的修改会影响后续请求。错误的接口代码会导致内存消耗过大,解决方法是确保在操作列表时创建副本。总结强调了理解应用上下文的重要性,以防止请求间的干扰。
摘要由CSDN通过智能技术生成

错误原理实例如下:

classOne():

list= [1, 2, 3]

@classmethoddefget_copy_list(cls):#copy一份list,这样对list的改变不会影响到此对象的list

returncls.list[:]

@classmethoddefget_list(cls):#直接返回此对象的list,任何对list的操作都会影响到此对象的list

returncls.listif __name__ == '__main__':#不影响到One对象的list值

a =One.get_copy_list()print(a) #[1, 2, 3]

a.append(4)print(a) #[1, 2, 3, 4]

print(One.get_list()) #[1, 2, 3]

#影响到One对象的list值

b =One.get_list()print(b) #[1, 2, 3]

b.append(5)print(b) #[1, 2, 3, 5]

print(One.get_list()) #[1, 2, 3, 5]

解决方法:调用One.get_copy_list()

在flask中,知识点:一个请求 在进入到进程后,会从进程 App中生成一个新的app(在线程中的应用上下文,改变其值会改变进程中App的相关值,也就是进程App的指针引用,包括g,),以及生成一个新的请求上下文(包括session,request)。并把此次请求需要的应用上下文和请求上下文通过dict格式传入到  栈中(从而保证每个请求不会混乱)。并且在请求结束后,pop此次的相关上下文。

错误接口代码大致如下:

class

Model_table

(_ModelPub, DB.Model):

__tablename__ = 'recruit_info'

__keys_map__ = {

'info': [

'uid', 'back_img', 'user_name', 'gender', 'age'

]

@Recruit.route('/update_info/', methods=['POST'])

info_list= Model_table.__keys_map__['info']

info_list+= ['img_id', 'prience_id']print(info_list)

响应如下(每次请求,都会向model类的列表属性值添加元素,这样会随着时间的增长导致内存消耗越来越大,最终导致服务崩溃):

67d9db7d66a9a65d7c466635d609837e.png

解决方法:

@Recruit.route('/update_info/', methods=['POST'])

info_list= Model_table.__keys_map__['info'][:] #copy一份list即可

info_list+= ['img_id', 'prience_id']print(info_list)

效果显示(每个请求不会混乱):

f217a94b04e9e9b18ddba5f999141ad5.png

总结:刚开始以为 在一次请求过程中,无论怎么操作都不会影响到其他请求的执行,当时只考虑了在 请求上下文中不会出现这种问题,但是 应用上下文,是 进程App相关属性或常量的一个引用(相当于指针),任何对应用上下文中的改变(g会在每次请求到来时从新赋值,然后在请求结束后跟随应用上下文,请求上下文一起消失),都会影响到其他请求的执行。

相关连接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值