错误原理实例如下:

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

错误接口代码大致如下:

class
Model_table
(_ModelPub, DB.Model):
__tablename__ = 'recruit_info' __keys_map__ = {
'info': [
'uid', 'back_img', 'user_name', 'gender', 'age'
]
@Recruit.route('/update_info/<string:action>', methods=['POST'])
info_list = Model_table.__keys_map__['info']
info_list += ['img_id', 'prience_id']
print(info_list)

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

解决方法:

@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/

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

  1. C#用反射实现两个类的对象之间相同属性的值的复制

    在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要 ...

  2. python+selenium遇到元素定位不到的问题,顺便记录一下自己这次的错误(报错selenium.common.exceptions.NoSuchElementException)

    今天在写selenium一个发送邮件脚本时,遇到一些没有找到页面元素的错误.经过自己反复调试,找原因百度,终于解决了.简单总结一下吧,原因有以下几点: 一:Frame控件嵌套,.Frame/Ifram ...

  3. python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?

    python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdef ...

  4. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]

    python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...

  5. .NET获取实例化对象的部分属性名称

    前言 项目中实例化的对象,对象中里面很有很多属性,有些是我们不需要的,有些是我们需要的,例如在下面的示例中:ID,CreateBy等属性在CB_Projects对象中是不需要的,在获取实例化对象属性名 ...

  6. [转]C#利用反射实现两个类的对象之间相同属性的值的复制

    本文转自:https://blog.csdn.net/u013093547/article/details/53584591 在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行 ...

  7. C#利用反射实现两个类的对象之间相同属性的值的复制

    http://blog.csdn.net/u013093547/article/details/53584591 今天在拷贝对象的时候,看着代码实在是有点烦,一堆一样的代码,还是找找有没有直接反射拷贝 ...

  8. Python基础中所出现的异常报错总结

    今天我们来探索python中大部分的异常报错 首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等. 打个比方很多公司年终送苹果笔记本,你 ...

  9. struts2视频学习笔记 07-08(为Action的属性注入值,指定需要Struts 2处理的请求后缀,常用常量)

    课时7 为Action的属性注入值(增加灵活性,适用于经常更改的参数) Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入 ...

随机推荐

  1. python ----列表、字符串、元组之间转换小结

    字符串转换列表 li =list("adfadfsf") #内部使用for循环 print(li) #输出结果:['a', 'd', 'f', 'a', 'd', 'f', 's' ...

  2. Learn how to use git

    Git配置 $ git config --global user.name "Your Name" $ git config --global user.email "e ...

  3. webApp总结

    有关Meta 基本Meta <!-- 设置缩放 --> <meta name="viewport" content="width=device-widt ...

  4. 用matlab生成mif文件

    在FPGA中,rom模块的初始化文件分为两种,一种是hex文件,另外一种是mif文件,这两种文件都可以通过Quartus进行手工创建,进行手工输入数据,也可以借助于专用的文件编辑器完成编辑. 在此介绍 ...

  5. void的几点用法

    1.可以通过void 0 获取undefined.等同于void(0). void 任意数 === undefined   // true void(0) === undefined  // true ...

  6. AFNetworking 3.0简单数据请求get&post

    /** *get请求方法 */ - (void)AFNGetUrl { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; ...

  7. 安装jdk1.8

    这是很普通的shell的脚本,只需要注意:echo 语句内出现的变量,需要转义! #!/bin/bash function get_current_time_stamp(){ echo `date & ...

  8. Python全栈之路----函数进阶----装饰器

    Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...

  9. C++之string类型详解

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...

  10. Codeforces1076E. Vasya and a Tree(dfs+离线+动态维护前缀和)

    题目链接:传送门 题目: E. Vasya and a Tree time limit per test seconds memory limit per test megabytes input s ...