Почему экземпляр webapp.WSGIApplication всегда определяется как глобальная переменная в коде движка приложения Google? - PullRequest
6 голосов
/ 02 марта 2011

Я начинаю учиться использовать движок приложений Google, и во многих кодах, с которыми я сталкивался, они объявляют экземпляр webapp.WSGIApplication как глобальную переменную. В этом нет необходимости, поскольку код работает нормально, когда он локально объявлен в главной функции. Мне всегда советовали избегать глобальных переменных. Так есть ли хорошая или даже не очень хорошая причина, по которой это делается именно так?

Пример:

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

application = webapp.WSGIApplication([  ('/', MainPage),  ('/sign', Guestbook)], debug=True)

def main():
  wsgiref.handlers.CGIHandler().run(application)

Почему бы не сделать следующее, что также работает:

class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

def main():
  application = webapp.WSGIApplication([  ('/', MainPage),  ('/sign', Guestbook)], debug=True)
  wsgiref.handlers.CGIHandler().run(application)

Это также работает в примерах с несколькими обработчиками запросов.

Ответы [ 2 ]

7 голосов
/ 02 марта 2011

Google App Engine предлагает удобную функцию под названием Кэширование приложений .
При первом вызове основного обработчика оценивается полный сценарий, импортируя модули и создавая глобальные элементы.
Если обработчик вызывается после того, как сценарий уже оценен, экземпляр приложения просто вызывает свою функцию main() напрямую.
Затраты на создание глобальных элементов оплачиваются только в первый раз, а созданные объекты могут повторно использоваться несколькими запросами, экономя время и ресурсы .

Тем не менее, настоятельно рекомендуется выбрать первый вариант, объявив переменную application вне функции main().

1 голос
/ 02 марта 2011

Возможно, это связано с кэшированием приложения, а не с его повторным созданием каждый раз (для повышения производительности):

Вы можете указать App Engine кэшировать сам скрипт-обработчик в дополнение к импортированным модулям.Если скрипт-обработчик определяет функцию с именем main(), тогда скрипт и его глобальная среда будут кэшироваться как импортированный модуль.Первый запрос скрипта на данном веб-сервере оценивает скрипт как обычно.Для последующих запросов App Engine вызывает функцию main() в кэшированной среде.

Взяты отсюда: http://code.google.com/appengine/docs/python/runtime.html#App_Caching

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...