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


    Ускоряем работу локального сервера в App Engine

    Октябрь 15th, 2008

    Скорее всего многие разработчики, отлаживающие большие проекты под локальным сервером разработки в App Engine, столкнулись с проблемой его однопоточности. Если на странице содержится куча внешних css, js файлов и картинок, ожидание ее загрузки может вывести из себя даже стойкого человека.

    Мы рассмотрим способ выноса статического содержимого приложения Django для обслуживания его сторонним сервером на базе пакета SimpleHTTPServer.

    Сначала создаем скрипт, который будет использован для старта обоих серверов:

    python simplehttpserver.py & dev_appserver.py -d --datastore_path="dev_appserver.datastore" .

    Создаем файл simplehttpserver.py со следующим содержимым:

    try:     import SimpleHTTPServer     import SocketServer     port = 9000     Handler = SimpleHTTPServer.SimpleHTTPRequestHandler     httpd = SocketServer.TCPServer(("", PORT), Handler)     httpd.serve_forever() except:     pass

    Исключение будет срабатывать в том случае, если порт уже занят (сервер запускается повторно). Далее напишем специальную функцию, которая будет принимать в своих параметрах объекты фреймворка Django HttpResponse и HttpRequest, и при необходимости перенаправлять браузер на сервер со статическим содержимым (если сервер запущен локально). Для повторного использования ее лучше вынести в отдельный файл (например, utils.py).

    def goFast(request,response):     developing = onDevelServer(request)     if developing:         for folder in ['images','css','js']:             dir = 'http://localhost:9000/%s/' % folder             response.content = response.content.replace('/%s/' % folder,dir)     return response def onDevelServer(request):     return request.META['SERVER_NAME'] == 'localhost'

    Этот код выполняет замену в ответе адрес ‘/images/homepage_logo.png’ на ‘http://localhost:9000/images/homepage_logo.png’. Ну и в завершении, модифицируем функцию render_to_response:

    from django.shortcuts import render_to_response as r2r from services.utils import goFast def render_to_response(template, ls):     return goFast(ls['request'], r2r(template,ls))

    Это все, теперь можно насладиться скоростью работы!




    Dojo 1.2 и Django 1.0 под Google App Engine версии 1.1.3

    Сентябрь 23rd, 2008

    Вместе с новым релизом Google App Engine версии 1.1.3 появилась возможность запустить библиотеку Dojo под App Engine.

    Основной проблемой является то, что стандартный пакет библиотеки Dojo не может быть загружен на GAE из-за превышения существующего лимита платформы в 1000 файлов. Django имеет ту же самую проблему. Решением проблемы в лоб является ручное удаление ненужных файлов, что позволяет уложиться примерно в 700 файлов приложения.

    С подобной проблемой столкнулись разработчики платформы LittleShoot, когда попытались запустить свое API «P2P 2.0″. Подразумевалось, что другие сайты будут выполять JavaScript запросы к сервису, что потребовало бы реализации кросс-доменного взаимодействия с библиотекой Dojo и привело бы к увеличению кода еще на 500 файлов, снова превысив лимит в 1000 файлов.

    Благодаря вышедшей недавно платформе GAE версии 1.1.3, в которой анонсирован модуль “zipserve”, появилась возможность работы со статическими файлами, помещенными в zip-архив. Гвидо Ван Россум (автор Python) использовал тот же самый подход для работы Django со своим замечательным приложением Rietveld, но только для подгрузки исполняемого кода. Read the rest of this entry »




    Web2py – первый взгляд

    Август 18th, 2008

    Web2Py (ранее называвшийся Gluon) – это новое слово в фреймворках для Python. Он очень похож на Django, но позволяет создавать и разрабатывать приложения прямо в онлайне. Он делает за вас большую часть работы и теперь появилась возможность запустить его на платформе Google App Engine.

    На сайте Vimeo выложен пример, показывающий начало разработки с Web2Py:




    Загрузка файлов через форму Django Forms

    Август 18th, 2008

    Поле FileField из библиотеки Django Forms можно привязать к свойству типа BlobProperty объекта хранилища. Ниже описано как это делается:

    Модель:

    from appengine_django.models import BaseModel
    from google.appengine.ext import db
    
    class AlbumItem(BaseModel):
      creationDate = db.DateTimeProperty(auto_now_add=True)
      image = db.BlobProperty(required=True)
      note = db.StringProperty()

    Отображение формы:

    class AlbumItemForm(ModelForm):
     image = FileField()
     note = CharField(widget=Textarea)
    
     class Meta:
      model = AlbumItem
      exclude = ("creationDate")
    
    def albumentry(request):
     if request.POST:
      form = AlbumItemForm(request.POST, request.FILES)
      if form.is_valid():
       albumEntry = form.save()
       return HttpResponseRedirect('/showalbumentry/%s' % albumEntry.key())
      else:
       return render_to_response('albumentry.html', locals())
     else:
      form = AlbumItemForm()
      return render_to_response('albumentry.html', locals())

    Содержимое указанного в коде файла шаблона albumentry.html тривиально, мы не будем полностью описывать его. Главное поместите в код формы шаблонную переменную {{form}} и не забудьте выставить атрибут enctype=»multipart/form-data» в теге <form>.

    Все работает автоматически – содержимое файла с изображением, загружаемое на сервер, будет помещено в свойство image. Используемый код работает на версиях App Engine SDK 1.1, Django Helper r30 и Django 0.97.




    Работа с FileField

    Август 15th, 2008

    Если при обработке форм данных через библиотеку Django Forms возникает проблема с работой полей FileField, то стоит убедиться, что конструктор формы задан как:

    form = NoteForm(request.POST, request.FILES)

    form = NoteForm(request.POST, request.FILES)

    вместо

    form = NoteForm(request.POST)

    form = NoteForm(request.POST)




    Проблемы локализации

    Август 14th, 2008

    Использование локализации приложений App Engine в фреймворке Django не слишком очевидно – могут вылезти различные проблемы и ниже приведен способ решения некоторых из них.

    Сначала вам необходимо создать каталог locale в каталоге приложения Django (то есть в том, в котором находится файл views.py). Для создания языковых файлов запустите команду django-admin.py makemessages из этого же каталога. Когда я это сделал, то получил следующее:

    Error message: makemessages is an unknown command on django-admin.py

    Это может произойти в том случае, если Django локально не установлен на этой машине – к примеру, используется тот, который находится в каталоге App Engine SDK. Чтобы исправить эту проблему выполните команду setup.py install

    Для корректной работы локализации в системе требуется установленный пакет gettext. Большинство Unix систем имеют его по умолчанию, однако владельцы Windows должны провести установку самостоятельно:

    1. Загружаем и разворачиваем gettext в отдельный каталог.
    2. Добавляем путь /bin из этого каталога к переменной окружения PATH.
    3. Загружаем файл iconv.dll и помещаем его в каталог bin.
    4. Загружеам intl.dll и также помещаем в каталог bin.



    Пользовательские фильтры Django в Google App Engine

    Август 12th, 2008

    Хотите использовать собственные фильтры Django в App Engine без необходимости тащить вместе с приложением весь код Django целиком? Это делается легко несколькими строчками кода.

    Сначала создаем специальный файл, который будет размещен в корне приложения. В моем случае я назвал его customfilters.py:

    import re
    from google.appengine.ext import webapp
    
    register = webapp.template.create_template_register()
    
    def escapeimg(body):
    	return re.sub(r'&lt;img (.*)/&gt;', '[IMG]', body)
    
    register.filter(escapeimg)

    Затем добавим следующую строчку вне определения функции main() приложения, например, сразу после операторов импорта модулей:

    """Загрузка своих фильтров Django """
    webapp.template.register_template_library('customfilters')

    После этого вы можете использовать определенные в файле customfilters.py фильтры в любых шаблонах без необходимости задания % load foobar %




    Новый адаптер для Django

    Август 11th, 2008

    Вышла новая версия App Engine Helper for Django. Она будет последней, которая поддерживает версию 0.96 этого фреймворка. Вся дальнейшная разработка будет сфокусирована на версии 1.0 Django.

    Ключевые улучшения в этом релизе:

    • Команда startapp теперь производит формирование совместимого с App Engine каркаса приложения.
    • Улучшен алгоритм обнаружения SDK в операционной системе Windows, который теперь производит анализ переменной окружения PATH и использует модуль win32api (если он доступен).
    • Изменен порт по умолчанию для команды runserver для соответствия стандартному Django.
    • Настройки сервера электронной почты из Django применяются и для Mail API.
    • Добавлена поддержка системы кэша в оперативной памяти.
    • Добавлена поддержка сессий Django (только для Django 1.0alpha).
    • Совместимый с Django декоратор login_required перемещен в стандартное место.
    • Реализация класса ModelForm заменена на аналогичную от App Engine.
    • Добавлена реализация метода repr в класс BaseModel.
    • Много различных вспомогательных улучшений и исправлений ошибок.



    Бесплатный хостинг в стиле Google App Engine

    Август 6th, 2008

    Оригинал статьи – http://blog.appenginefan.com/2008/04/free-webhosting-google-app-engine-style.html

    Недавно я обсуждал проблему, как можно выжать больше возможностей из тех 10 приложений, которые допускается создать во время тестового периода. Что делать, если стоит совершенно противоположная задача? Что если зарегистрирован хороший идентификатор приложения и нет никаких идей, как правильно его использовать? Почему бы не запустить на нем свой персональный сайт со статичным содержимым? Тем более, что это все бесплатно :-)

    Самое маленькое приложение

    Следующий файл app.yaml является полноценным приложением под App Engine. Достаточно поместить все файлы в каталог «static» и сайт будет работать:

    application: mysite
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /(.*)
    static_files: static/\1
    upload: static/(.*)

    Как это работает? Регулярное выражение «/(.*)» указывает на то, что «должен быть обслужен любой входящий запрос.» Следующая строка указывает приложению искать статический файл с именем, совпадающим с запросом, в каталоге «static». Последней строчкой мы задаем необходимость опубликовать этот каталог, как содержащий статический контент нашего приложения.

    Другими словами, в простом случае мы можем перевести наш персональный сайт на платформу App Engine, выполнив некоторые действия по настройке файла конфигурации. Но подождите, это еще не все:

    Настройка шаблонов

    Большинство разработчиков платформы App Engine в первые дни открытия попросили компанию Google включить в движок реализацию языка PHP. Безусловно для этого имеются множество причин, но я сомневаюсь что большинство типичных задач, для которых используется PHP, не покрываются возможностями шаблонов Django. Если, к примеру, вы используете PHP только для того, чтобы дублировать в каждой странице сайта одну и ту же навигационную панель, то App Engine это для вас.

    Посмотрите на сайт Training Wheels. Он является примером того, как с помощью файла app.yaml можно реализовать обработку страниц с более сложной структурой:

    • запросы к файлам, которые не заканчиваются строками «django» и «djhtml» обрабатываются как статический контент
    • запросы же к файлам с расширениями «django/djhtml» обрабатываются с помощью шаблонной системы Django

    В других словах вы можете использовать богатейшие возможности шаблонов Django, без написания единой строчки кода на языке Python. Для дополнительной информации – обратитесь к разделу Downloads рассматриваемого выше сайта.

    Обработка больших файлов

    На сегодняшний момент, существуют ограничения на размер одного файла, размещаемого на платформе App Engine. Тем не менее, независимо от размера файла может иметь смысл разместить большие файлы в другом месте, к примеру на Google Sites. Причина, почему это стоит сделать: квота. К примеру, если вы выложите для загрузки большой файл (типа большого pdf документа), его могут скачивать много раз за день. Что можно сделать, чтобы не закончилась квота? Достаточно создать раздел «file bin» на Google Sites, загрузить в него большие файлы, которые также будут размещаться там без взимания платы. Для примера смотрите раздел Downloads вышеприведенного сайта.

    В завершении

    Таким образом, если вы еще не придумали какое прорывное приложение можно создать на платформе, есть смысл начать с миграции на нее вашего персонального сайта. Это не только позволит сэкономить несколько баксов в год, а также получить дополнительные возможности по созданию динамического контента на Google App Engine, когда они вам понадобятся.




    Google App Engine Helper для Django

    Июль 21st, 2008

    После того, как платформа Google App Engine была открыта для разработчиков, большинство предложений, которые поступили в компанию, касались более тесной интеграции с популярным фреймворком Django.

    Компания Google разработала и опубликовала специальный каркас, который обеспечивает более легкий процесс разработки проекта на Django и последующего его запуска на Google App Engine.

    Возможности этого каркаса:

    • Сохранение возможности использования большинства команд скрипта manage.py
    • Класс BaseModel имеет все те же возможности, что и стандартный для Django класс Model.
    • Возможность сериализации и десериализации экземпляров модели в код JSON, YAML и XML.
    • Доступ к тестовой среде Django с возможностью поддержки загрузки тестовых данных.

    Каркас опубликован под лицензией Apache 2.0. Команда Google продолжает работу с сообществом разработчиков Django для внесения в проект дополнительной функциональности.

    Каркас может быть загружен со страницы http://code.google.com/p/google-app-engine-django. Русскоязычная статья по его использованию находится по адресу http://googleappengine.ru/articles/appengine_helper_for_django.html. Об ошибках и предложениях по дополнительной функциональности можно сообщить на странице проекта.