Flask - 模型在提交后没有重置?

时间:2017-08-05 13:55:21

标签: python-3.x class flask

我有一个模型:

class DnaString:
    complement_dict = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'}
    contents = {'A': 0, 'T': 0, 'G': 0, 'C': 0}

    @classmethod
    def update(cls, dnastring):
        for nucleotide in dnastring:
            cls.contents[nucleotide] += 1


    def __init__(self, dnastring):
        self.dnastring = dnastring
        self.update(dnastring)

观点:

@protein.route('/', methods=["GET", "POST"])
def home():
    if request.method == 'GET':
        return render_template('get_protein.html')
    else:
        dnastring = DnaString(request.form['dnastring'])
        return render_template('dna_analysis.html',
                               dnacontents=dnastring.contents)

当我第一次输入dna字符串时,如果我刷新页面并输入另一个dna字符串,看起来它不会创建一个新的DnaString实例,而是添加到同一个实例。因此,如果我输入一个dna字符串,一旦点击刷新并输入相同的字符串,内容将打印出双倍。

每次运行页面时,有没有办法创建DnaString的新实例?

我想我可以将内容改为类方法吗?但根据我的理解,对象的原因是它们各自独立?例如,Human可以是一个类,但如果我将其分配给变量john = Human(),那么johnHuman类的自己的实例吗?

1 个答案:

答案 0 :(得分:1)

@classmethod不是你想要的。这将改变类变量(而不是实例变量)。这里可以看到一个更简单的版本:

>>> class Foo(object):
...     l = []
...     @classmethod
...     def add(cls, x):
...         cls.l.append(x)
...
>>> Foo.l
[]
>>> Foo.add(2)
>>> Foo.l
[2]
>>> Foo.add(2)
>>> Foo.l
[2, 2]

如果在持久层中找不到新对象,则应该使用每个请求实例化一个新对象。

>>> class Foo(object):
...     def __init__(self):
...         self.l = []
...     def add(self, x):
...         self.l.append(x)
...
>>> foo1 = Foo()
>>> foo1.add(2)
>>> foo1.l
[2]
>>> foo1.add(2)
>>> foo1.l
[2, 2]
>>> foo2 = Foo()
>>> foo2.add(2)
>>> foo2.l
[2]