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.
Для минимизации отличий был создан специальный каркас разработки (helper). Он предоставляет альтернативную реализацию для той части кода Django, которая не может напрямую работать с Google App Engine.
Файлы рассматриваемого каркаса можно скачать с проекта с открытыми исходными текстами по адресу http://code.google.com/p/google-app-engine-django.
Загрузите и распакуйте файлы архива в каталог с именем mysite
В получившемся каталоге вы увидите стандартную структуру проекта Django (файлы settings.py, urls.py и другие) и подкаталог (или "приложение" в терминологии Django) с именем appengine_django. Каркас осуществляет работу по интеграции Django и Google App Engine.
Каркас должен иметь возможность доступа к файлам 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, содержащего модели, представления и тесты. Для этого можно использовать стандартную команду 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 db
class 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 использует для своей работы реляционную базу данных и поэтому не поддерживает работу в Google App Engine. Замена его функциональности автоматически предоставляется сервером разработки по адресу /_ah/admin - например, http://localhost:8080/_ah/admin.
Схема URL и работа функций представлений в Google App Engine действуют аналогично работе в обычной среде. Но так как модели не являются потомками Django класса Model, вы не можете использовать класс Form. Вместо него в Google App Engine SDK реализован совместимый пакет google.appengine.ext.db.djangoforms. Модуль djangoforms также может быть задействован в независимом от стандартного фреймворка 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, как было описано выше, и произвели регистрацию приложения на сайте http://appengine.google.com/, то можете быстро его опубликовать с помощью утилиты 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).
В конфигурационном файле app.yaml, который поставляется с каркасом, указано, что сервер приложений должен для обработки каждого запроса, кроме статического содержимого, вызывать скрипт main.py. Файл main.py содержит код, который берет на себя заботу по загрузке каркаса и запуску WSGI-обработчика Django.
Все статическое содержимое (стили CSS, изображения и тому подобное) можно поместить в каталог my_application/static.
Для внутренних нужд 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.
Модуль каркаса производит удаление и модификацию настроек среды несовместимых с платформой Google App Engine. Для просмотра этих изменений в сравнении с настройками Django по умолчанию можно воспользоваться командой diffsettings. Например:
python manage.py diffsettings DATABASE_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. Если у вас появятся предложения по добавлению нового функционала в этот модуль, вы можете разместить их на сайте http://code.google.com/p/google-app-engine-django/issues/entry