• Home
  • Учебник по ExtJS
  • О сайте
  •  


    Как скачать свой код с App Engine?

    Сентябрь 4th, 2008

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

    Конечно же, существует отдельный вариант загрузить вместе с проектом специальный AJAX shell, который позволит просматривать код опубликованного приложения. Скачать подобное решение можно отсюда.

    Давайте рассмотрим пример просмотра кода самой AJAX-shell, которая расположена по адресу http://shell.appspot.com.

    1. Сначала узнаем, где мы находимся:
      >>> os.getcwd() 'base/data/home/apps/shell/1.29/'
    2. Выведем содержимое каталога:
      >>> os.listdir(".") ['shell.py', 'templates']
    3. Далее откроем интересующий нас файл с помощью вывода его содержимого на экран:
      >>> file = open("shell.py") >>> for line in file:     print line #!/usr/bin/python [далее содержимое файла]

    Возможно в будущем появятся какие-то комплексные удобные решения, которые позволят интерактивно взаимодействовать с кодом приложения. Чем не идея для нового приложения?




    Cron и AJAX в App Engine

    Август 15th, 2008

    В этой статье мы рассмотрим дополнительные сервисы, которые реализованы сторонними разработчиками, но очень пригодятся для воплощения некоторых проектов.

    Сервис Cron
    Иногда требуется через регулярные интервалы времени выполнять какие-то действия, к примеру удаление временных данных или обновление значений счетчиков. Этот сервис является простой надстройкой над утилитой wget, которая обращается по заданному URL в определенное время.

    Сервис Comet
    А это, как говорится, мой любимый. Представьте, что необходимо создать приложение-чат на Google App Engine. Самый простейший способ, который вспомнят ветераны веб-строения – использование долгоиграющих HTTP запросов и потоковая выдача данных от сервера, который будет сообщать об новых событиях. Однако на платформе App Engine такой вариант неприменим по ряду архитектурных ограничений. Имеются другие варианты оперативного взаимодействия с сервером, один из которых можно взять на вооружение – использование на клиентской части
    XMLHttpRequest запросов. В английском языке существует даже неологизм, связанный с набором таких технологий – Comet.

    Теперь давайте подсчитаем: Google выделяет квоту 650 тысяч HTTP запросов в день. Допустим, что мы будем опрашивать сервер каждую секунду.

    650k запросов в день / 86k секунд в день = 7 пользователей могут быть в чате целый день

    Согласитесь, что 7 пользователей для масштабируемого приложения не являются достойным показателем. Описываемый сервис Comet позволяет преодолеть эти ограничения и не иметь проблем с дополнительным сервером.

    Главным ограничением его использования является то, что вы должны иметь собственный домен для работы приложения. К сожалению, сервис не поддерживает работу сайтов в зоне *.appspot.com.

    Итог
    Ну и конечно все примеры можно загрузить в исходных кодах.




    Кроссдоменный прокси на Google App Engine

    Август 12th, 2008

    Большинство браузеров не позволяют Javascript Ajax обращения к другим доменам, поэтому использование Flickr API с Google App Engine весьма затруднено. Описанный ниже код позволяет организовать простой прокси-сервер:

    import cgi
    import urllib
    from google.appengine.ext import webapp
    from google.appengine.api import urlfetch
    
    class FlickrController(webapp.RequestHandler):
    	"""Прокси для Ajax запросов к Flickr"""
    	def get(self):
    		flickrapiendpoint = 'http://api.flickr.com/services/rest/'
    		flickrapikey = 'you_flicker_api_key'
    
    		params = self.request.GET
    		params.add('api_key', flickrapikey)
    		params.add('format', 'json')
    		apiquery = urllib.urlencode(params)
    
    		result = urlfetch.fetch(url=flickrapiendpoint + '?' + apiquery, method=urlfetch.GET)
    		self.response.out.write(result.content)
    
    def main():
    	application = webapp.WSGIApplication(
    		[('/flickr/', FlickrController)],
    		debug=True)
    	wsgiref.handlers.CGIHandler().run(application)
    
    if __name__ == "__main__":
    	main()