Глобальная переменная, которая сохраняется только на время существования запроса - Python, Webapp2

У меня есть скрипт Python в моем приложении WebApp2 в Google App Engine:

x = 0

class MyHandler(webapp2.RequestHandler):

      def get(self):

          global x
          x = x + 1
          print x

С каждым обновлением страницы (или подключением нового пользователя) количество увеличивается с каждым разом. Python не запускает новый процесс при каждом запросе (но я ожидал этого). Как я могу справиться со сценариями, в которых я хотел бы, чтобы глобальная переменная сохранялась только в течение срока действия запроса? Могу ли я использовать переменную экземпляра и как именно?

1 ответ

Поведение, которое вы видите, ожидается. Новые экземпляры не запускаются для каждого запроса.

Используйте объект запроса, объект env или локальную переменную потока, чтобы хранить информацию, которую вы хотите, чтобы она была доступна в любом месте вашего кода в течение всего срока действия запроса. (Environ воссоздается в каждом запросе, поэтому это безопасно).

См. Является ли threading.local() безопасным способом хранения переменных для одного запроса в Google AppEngine? для обсуждения использования локального хранилища потока.

Вот пример хранения локального объекта запроса для хранения конкретной информации в течение срока действия запроса. Весь этот код должен быть внутри вашего обработчика. Все части документированы в документах webapp2. Кстати, я не использую webapp2, так что это не проверено. (Я использую Pyramid / Bobo и эту модель для выполнения кэширования на уровне запросов).

Класс MyHandler(webapp2.RequestHandler):

  def get(self):
      req = webapp2.get_request()   
      # you have request in self, however this is to show how you get a 
      # request object anywhere in your code.


      key = "Some Key"

      if req:
            # getting some store value from the environ of request (See WebOb docs)
            someval = req.environ.get(key,None)
            if someval :
                # do something

      # and setting
      if req:
            req.environ[key] = 'some value'

Делая это таким образом, есть ограничение, что значение environment ['key'] должно быть строкой.

Прочитайте документы Webob, как хранить произвольные значения в объекте запроса. http://docs.webob.org/en/stable/reference.html -

req.environ['webob.adhoc_attrs']
{'some_attr': 'blah blah blah'}

Кроме того, если вы прочитали документацию по объекту запроса webapp2, существует реестр, который вы можете использовать для хранения информации - http://webapp-improved.appspot.com/api/webapp2.html.

Обратите внимание, что любая переменная, которую вы определяете вне обработчика запроса, по существу кэшируется и доступна для времени существования экземпляров. Это где вы идете не так.

Чтобы понять, как / почему работает кэширование на уровне приложения и почему ваша первая попытка не дает желаемого результата, взгляните на https://cloud.google.com/appengine/docs/python/requests

Другие вопросы по тегам