缓存的对象在Django中被重用

时间:2018-08-01 10:38:31

标签: python django caching

我正在研究Django项目,并且有一些类的实例。 我用键“ A”缓存了实例A,并在另一个请求中创建了一个新的实例B。问题是实例B现在具有实例A的数据。当我更改实例B的数据并从缓存中获取实例“ A”时,实例A的数据也会更改。

我想这与python的重用机制有关。有人知道如何解决此问题吗?

编辑1: 这就是我使用其名称创建类的方法:

def create_model_by_name(name):
    name = name.capitalize()
    klass = globals()[name]
    instance = klass()
    return instance

我使用django.core.cache.cache来缓存对象。

这是我存储在班级中的一些数据。我有一些继承自Abstract的类。

class Abstract:
    class_name = 'unknown'
    prev_text = []
    props = {}
    waiting_state = ''
    output = ''
    props_alias = {}

2 个答案:

答案 0 :(得分:1)

这里:

class Abstract:
    class_name = 'unknown'
    prev_text = []
    props = {}
    waiting_state = ''
    output = ''
    props_alias = {}

所有这些属性都是类属性-它们属于类本身,而不是实例,并且在类的所有实例之间共享(除非被实例属性遮盖)。

如果需要实例属性,则必须在__init__方法中定义它们,即:

class Abstract:
    def __init__(self):
        self.class_name = 'unknown'
        self.prev_text = []
        self.props = {}
        self.waiting_state = ''
        self.output = ''
        self.props_alias = {}

如果您没有正确学习Python,尝试使用Django可能会令人沮丧,并且假定Python的对象模型是Java或PHP之类的东西无疑是一种灾难。因此,请帮自己一个忙,并首先学习Python。

答案 1 :(得分:0)

我想您的问题是prev_text = []props_alias = {}之类的东西,因为这些列表和字典在所有实例之间都是共享的。尝试将它们移至__init__方法中,例如:

class Abstract:
    class_name = 'unknown'
    prev_text = None
    props = None
    waiting_state = ''
    output = ''
    props_alias = None

    def __init__(self):
        self.prev_text = []
        self.props = {}
        self.props_alias = {}