前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错

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

作者头像
用户1558882
发布2018-10-25 14:51:26
4.9K0
发布2018-10-25 14:51:26
举报
文章被收录于专栏:RgcRgc

错误原理实例如下:

代码语言:javascript
复制
class One():
    list = [1, 2, 3]

    @classmethod
    def get_copy_list(cls):
        # copy一份list,这样对list的改变不会影响到此对象的list
        return cls.list[:]

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


if __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此次的相关上下文。

错误接口代码大致如下:

代码语言:javascript
复制
class

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

解决方法:

代码语言:javascript
复制
@Recruit.route('/update_info/<string:action>', methods=['POST'])
    info_list = Model_table.__keys_map__['info'][:]  #copy一份list即可
    info_list += ['img_id', 'prience_id']
    print(info_list)

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

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

相关连接:

https://blog.tonyseek.com/post/the-context-mechanism-of-flask/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档