Почему атрибуты объекта CherryPy постоянны между запросами? - PullRequest
4 голосов
/ 10 октября 2010

Я писал методы отладки для своего приложения CherryPy. Данный код был (очень) в основном эквивалентен этому:

import cherrypy

class Page:
    def index(self):
        try:
            self.body += 'okay'
        except AttributeError:
            self.body = 'okay'
        return self.body
    index.exposed = True

cherrypy.quickstart(Page(), config='root.conf')

Я с удивлением заметил, что от запроса к запросу производительность self.body росла. Когда я зашел на страницу от одного клиента, а затем от другого одновременно открытого клиента, а затем обновил браузеры для обоих, вывод был постоянно увеличивающейся строкой «все в порядке». В моем методе отладки я также записывал специфичную для пользователя информацию (то есть данные сеанса), и она также отображалась в выходных данных обоих пользователей.

Я предполагаю, что это потому, что модуль python загружается в рабочую память, а не перезапускается для каждого запроса.

У меня такой вопрос: как это работает? Как получается, что self.debug сохраняется от запроса к запросу, а cherrypy.session и cherrypy.response - нет?

И есть ли способ установить атрибут объекта, который будет использоваться только для текущего запроса? Я знаю, что могу перезаписывать self.body для каждого запроса, но это немного нерегулярно. Есть ли стандартный или встроенный способ сделать это в CherryPy?

(второй вопрос перенесен на Как работает кэширование CherryPy? )

Ответы [ 2 ]

4 голосов
/ 11 октября 2010
Анализ

synthesizerpatel верен, но если вы действительно хотите сохранить некоторые данные для запроса , то сохраните их как атрибут в cherrypy.request, а не в сеансе. Объекты cherrypy.request и .response являются новыми для каждого запроса, поэтому нет никаких опасений, что какой-либо из их атрибутов будет сохраняться при запросах. Это канонический способ сделать это. Просто убедитесь, что вы не перезаписываете какие-либо внутренние атрибуты cherrypy! Например, cherrypy.request.body уже зарезервирован для передачи вам, скажем, тела запроса JSON POSTed.

Для всех деталей того, как именно работает область видимости, лучшим источником является исходный код .

4 голосов
/ 10 октября 2010

Вы ударили по голове, заметив, что вы получаете те же данные от self.body, потому что это то же самое в памяти процесса Python, выполняющего CherryPy.

self.debug поддерживает 'состояние' по этой причине, это атрибут работающего сервера.

Чтобы установить данные для текущего сеанса, используйте cherrypy.session ['fieldname'] = 'fieldvalue', для получения данных используйте cherrypy.session.get ('fieldname').

Вам (программисту) не нужно знать идентификатор сеанса, с ним справится cherrypy.session - идентификатор сеанса автоматически генерируется на лету cherrypy и сохраняется при обмене cookie между браузером и сервером на последующие взаимодействия запрос / ответ.

Если вы не укажете тип хранилища для cherrypy.session в своей конфигурации, он будет храниться в памяти (доступной для сервера и для вас), но вы также можете хранить файлы сеансов на диске, если хотите, что может быть удобным способом для отладки без необходимости писать кучу кода для получения идентификаторов сеансов или значений ключ / пара с работающего сервера.

Для получения дополнительной информации проверьте http://www.cherrypy.org/wiki/CherryPySessions

...