• Официальный сайт SDK
  • Сайт с примерами кода

Использование специального каркаса для интеграции Google App Engine с Django

Мэт Браун
Май 2008

Введение

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

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

До того, как вы приступите к чтению материалов этой статьи, убедитесь, что на вашем компьютере установлены Python версии 2.5 и Google App Engine SDK. Кроме того, предполагается, что вы уже имеете некоторый опыт по разработке приложений на Django.

Совместимость Google App Engine и Django

Среда, в которой работают приложения Google App Engine, имеет два больших отличия от стандартной среды Django.

  1. Платформа Google App Engine не предоставляет доступ к реляционной базе данных и не может быть использована для работы со стандартным для Django классом Model.
  2. Google App Engine также не позволяет производить импорты некоторых модулей и выполнять ряд операций (например, создание и удаление тестовой базы данных).

Для минимизации отличий был создан специальный каркас разработки (helper). Он предоставляет альтернативную реализацию для той части кода Django, которая не может напрямую работать с Google App Engine.

Загрузка каркаса

Файлы рассматриваемого каркаса можно скачать с проекта с открытыми исходными текстами по адресу .

Загрузите и распакуйте файлы архива в каталог с именем mysite

В получившемся каталоге вы увидите стандартную структуру проекта Django (файлы settings.py, urls.py и другие) и подкаталог (или "приложение" в терминологии Django) с именем appengine_django. Каркас осуществляет работу по интеграции Django и Google App Engine.

Подключение Google App Engine SDK

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

Если вы работаете на операционной системе Windows и использовали инсталлятор SDK, то вам необходимо дополнительно установить пакет Расширения Python для Windows для автоматического обнаружения SDK.

В противном случае, если вы работаете на операционной системе Linux, или установили SDK путем распаковки архива с zip-файлом на Windows или Mac OS, то необходимо скопировать каталог с SDK или поместить ссылку с него на каталог .google_appengine (обратите внимание на первую точку, это скрытый каталог) в каталог mysite, созданный ранее.

В операционных системах Linux и Mac OS для этого можно использовать командную строку. Команда должна быть запущена из каталога mysite.

ln -s /path/to/google_appengine .google_appengine

Проверка среды разработки

Необходимо выполнить проверку того, что ваша среда разработки правильно настроена и может запустить сервер. Перейдите в каталог mysite и выполните команду:

python manage.py runserver

Вы увидите вывод подобный этому

INFO:root:Checking for updates to the SDK.
INFO:root:The SDK is up to date.
INFO:root:Running application appengine-django-example on port 8080: http://localhost:8080

Откройте адрес to http://localhost:8080/ в браузере и увидите стандартное приветствие Django. Каркас прозрачно заменил стандартную команду runserver своей собственной, которая выполняет команду dev_appserver, входящую в состав Google App Engine SDK.

Вы также можете запустить тесты с помощью установленного каркаса.

python manage.py test.................................................
----------------------------------------------------------------------
Ran 49 tests in 3.760s

Изменение названия приложения

Откройте файл app.yaml в своем любимом редакторе и поменяйте название приложения в параметре application. Например:

application: mysite

Для рассматриваемого каркаса эта информация необходима для связи хранилища данных приложения с этим проектом.

Создание приложения Django

Теперь можно перейти к созданию приложения Django, содержащего модели, представления и тесты. Для этого можно использовать стандартную команду manage.py startapp:

python manage.py startapp polls

В результате будет создан каталог polls с содержимым:

polls/
  __init__.py
  models.py
  views.py

Создание моделей

Приложение polls имеет две модели: polls и choices. Для их создания необходимо использовать класс Model, предоставляемый каркасом и соответствующий набор свойств хранилища Google App Engine. Стандартные для Django классы Model и Property работать не будут. Хотя и наши модели не используют класс модели Django, каркас берет на себя заботу, чтобы они выглядели как модели Django и производит такую же их регистрацию в системе.

Отредактируйте файл polls/models.py, чтобы его содержимое стало похожим на это:

from appengine_django.models import BaseModel
from google.appengine.ext import dbclass Poll(BaseModel):
    question = db.StringProperty()
    pub_date = db.DateTimeProperty('date published')class Choice(BaseModel):
    poll = db.ReferenceProperty(Poll)
    choice = db.StringProperty()
    votes = db.IntegerProperty()

Активация моделей

При работе с Google App Engine нет необходимости выполнять какие-то операции по созданию таблиц баз данных для используемых моделей. Команды sql*, syncdb и validate были удалены из программы manage.py, поэтому нет смысла их использовать.

Все что необходимо, для того, чтобы активировать созданные модели - отредактировать файл settings.py и убедиться, что значение 'polls' указано в параметре INSTALLED_APPS.

Прямая работа с интерфейсом

Модуль каркаса поддерживает работу с интерактивной командной строкой Python и позволяет выполнять все операции с локальным хранилищем, с которым работает сервер разработки. Доступ к командной строке можно получить следующей командой:

python manage.py shell

Обратите внимание, что интерактивная командная строка не применяет ограничения платформы, которые будут действовать при работе приложения.

Административный интерфейс Django

Стандартный административный интерфейс Django использует для своей работы реляционную базу данных и поэтому не поддерживает работу в Google App Engine. Замена его функциональности автоматически предоставляется сервером разработки по адресу /_ah/admin - например, http://localhost:8080/_ah/admin.

Представления, формы и URL

Схема URL и работа функций представлений в Google App Engine действуют аналогично работе в обычной среде. Но так как модели не являются потомками Django класса Model, вы не можете использовать класс Form. Вместо него в Google App Engine SDK реализован совместимый пакет google.appengine.ext.db.djangoforms. Модуль djangoforms также может быть задействован в независимом от стандартного фреймворка Django проекте.

Последующая разработка

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

Версии Django

Каркас поддерживает работу совместно с последним стабильным релизом Django (0.96) и текущим разрабатываемым релизом. Если вы ведете разработку на последнем стабильном релизе Django, то никаких дополнительных действий предпринимать не нужно. Выполните импортирование модулей Django, как это делаете обычно.

Для использования разработочной версии фреймворка необходимо произвести загрузку Django на сервер вместе с кодом приложения. Достаточно скопировать файлы Django в каталог с приложением:

my_application/app.yaml
my_application/main.py
my_application/django/*

Для уменьшения количества файлов, можно безопасно удалить каталоги:

django/bin
django/contrib/admin
django/contrib/databrowse

Загрузка приложения

Если вы используете Django версии 0.97, как было описано выше, и произвели регистрацию приложения на сайте , то можете быстро его опубликовать с помощью утилиты manage.py с параметром update:

python manage.py update

Это эквивалентно запуску команды appcfg.py напрямую из Google App Engine SDK. Таким же образом можно выполнять команды rollback и vacuum_indexes. Однако, они не будут доступны через программу manage.py при использовании Django версии 0.96 (которая включена в Google App Engine SDK).

Запуск WSGI-обработчика

В конфигурационном файле app.yaml, который поставляется с каркасом, указано, что сервер приложений должен для обработки каждого запроса, кроме статического содержимого, вызывать скрипт main.py. Файл main.py содержит код, который берет на себя заботу по загрузке каркаса и запуску WSGI-обработчика Django.

Все статическое содержимое (стили CSS, изображения и тому подобное) можно поместить в каталог my_application/static.

Использование внутренней базы данных с App Engine

Для внутренних нужд Django каркас предоставляет использование виртуальной базы данных 'appengine'. Инициализация хранилища происходит прозрачно при запуске кода извне сервера приложений (например, при использовании интерактивной командной строки, запуске тестов и загрузке/выгрузке тестовых данных).

Хранилище, используемое при разработке приложений, можно очистить командами reset и flush программы manage.py.

Примечание: Для каждого проекта Django каркас задействует отдельную базу данных. Путь к хранимым данным может отличаться от пути, используемого для работы сервера dev_appserver.py, входящего в комплект Google App Engine SDK.

Тестирование и тестовые данные

Как рассматривалось в предыдущих разделах, каркас имеет возможность использовать стандартную для Django инфраструктуру для тестов и наполнять ее тестовыми данными.

Сериализация и десериализация моделей, наследуемых от базового класса BaseModel, поддерживается каркасом в форматах YAML, JSON и XML.

Поля моделей типа ReferenceProperty сериализуются с использованием метода str() ассоциированного экземпляра класса Key.

Проведение тестов и загрузка тестовых данных может быть произведена с использованием стандартных команд test, loaddata и dumpdata программы manage.py.

Обновление настроек Django

Модуль каркаса производит удаление и модификацию настроек среды несовместимых с платформой Google App Engine. Для просмотра этих изменений в сравнении с настройками Django по умолчанию можно воспользоваться командой diffsettings. Например:

python manage.py diffsettingsDATABASE_ENGINE = 'appengine'
DEBUG = True
INSTALLED_APPS = ['appengine_django']
MIDDLEWARE_CLASSES = ()
ROOT_URLCONF = 'urls'  ###
SETTINGS_MODULE = 'mysite.settings'  ###
SITE_ID = 1  ###
TEMPLATE_DEBUG = True
TIME_ZONE = 'UTC'

Дополнительно

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