我在python + pylons中有一个提交给控制器的简单表单。但是,每个页面加载似乎都不是该类的新实例化。相反,仍可访问在上一页加载中指定的类变量。
这里发生了什么?什么是解决方案?
答案 0 :(得分:1)
Pylons使用多线程应用程序服务器,并且不会从请求中清除变量。这是一个性能问题,因为重新实例化整个类树将是昂贵的。不要将用户返回的数据存储在类中,而是使用会话系统(Pylons comes with one或使用像Beaker这样的东西)或后端数据库,如SQLAlchemy,SQLObject或PyMongo。
此外,由于框架的多线程特性,您应该避免像瘟疫这样的共享对象(如全局变量),除非您非常小心地确保以线程安全的方式使用它们(例如只读) )。某些Pylons提供的对象(请求/响应)已写入线程本地,因此不必担心这些。
答案 1 :(得分:1)
一个常见的程序员监督是将list []定义为默认参数或类初始化程序仅计算一次。如果您有类变量,例如列表,我建议您在 init 中初始化它们。我给你举个例子。
>>> class Example(object):
... a = []
... def __init__(self):
... self.b = []
...
>>> foo = Example()
>>> bar = Example()
>>> foo.a
[]
>>> bar.a
[]
>>> foo.b
[]
>>> bar.b
[]
>>> foo.a.append(1)
>>> foo.b.append(2)
>>> foo.a
[1]
>>> foo.b
[2]
>>> bar.a
[1]
>>> bar.b
[]