Почему python + pylons «запоминают» ранее указанные переменные класса? - PullRequest
1 голос
/ 03 марта 2010

У меня есть простая форма в python + pylons, которая подчиняется контроллеру. Тем не менее, каждая загрузка страницы не кажется свежим экземпляром класса. Скорее, переменные класса, указанные при загрузке предыдущей страницы, по-прежнему доступны.

Что здесь происходит? И в чем решение?

Ответы [ 2 ]

1 голос
/ 03 марта 2010

Обычное упущение программистов заключается в том, что определение списка [] в качестве аргумента по умолчанию или инициализатора класса выполняется только один раз. Если у вас есть переменные класса, такие как списки, я рекомендую инициализировать их в 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
[]
1 голос
/ 03 марта 2010

Pylons использует многопоточный сервер приложений, и переменные не очищаются от запроса к запросу. Это проблема производительности, так как повторное создание целых деревьев классов будет дорогостоящим. Вместо хранения данных, возвращаемых пользователем в классе, используйте систему сессий ( Pylons поставляется с одним или используйте что-то вроде Beaker) или внутреннюю базу данных, например SQLAlchemy, SQLObject или PyMongo.

Кроме того, из-за многопоточного характера фреймворка вы должны избегать общих объектов (таких как глобальные), таких как чума, если вы не очень осторожны, чтобы убедиться, что вы используете их в поточно-ориентированном виде (например, только для чтения ). Некоторые предоставленные Pylons объекты (запрос / ответ) написаны как локальные для потоков, поэтому не беспокойтесь об этом.

...