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

Совместная работа Django и Google App Engine

Дэймон Кохлер
Апрель 2008

Введение

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

Использование Django версии 0.96.1

В состав платформы Google App Engine включен Django версии 0.96, который является одним из последних стабильных релизов. Для работы достаточно будет выполнить простое импортирование модулей Django. Далее по тексту мы рассмотрим, что необходимо сделать, если вы захотите использовать для работы приложения нестабильную разрабатываемую версию Django.

Создание WSGI обработчика в файле main.py

Чтобы адаптировать Django приложение к обработчику WSGI, необходимо проделать несколько шагов. Нужно импортировать util из пакета google.appengine.ext.webapp и обработчик WSGI из поставки Django. Вместо того, чтобы отладить приложение через программу manage.py, мы можем учитывать все исключения в журнале ошибок, содержимое которого доступно через Административную консоль. Для дополнительной информации о ведении журнала ошибок, прочтите эту статью.

import logging, os# Импорт модулей Google App Engine.
from google.appengine.ext.webapp import util# Заставляем Django перегрузить свои настройки.
from django.conf import settings
settings._target = None# Необходимо установить значение этой переменной окружения до импортирования любого модуля Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'import logging
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcherdef log_exception(*args, **kwds):
  logging.exception('Exception in request:')# Подключить журнал ошибок.
django.dispatch.dispatcher.connect(
   log_exception, django.core.signals.got_request_exception)# Удалить обработчик отката транзакций.
django.dispatch.dispatcher.disconnect(
    django.db._rollback_on_exception,
    django.core.signals.got_request_exception)def main():
  # Создание экземпляра приложения для работы с WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()  # Запустить WSGI CGI обработчик приложения.
  util.run_wsgi_app(application)if __name__ == '__main__':
  main()

Дополнительно файл конфигурации приложения app.yaml необходимо привести к следующему виду:

application: my_application
version: 1
runtime: python
api_version: 1handlers:
- url: /static
  static_dir: static- url: /.*
  script: main.py

В каталоге static можно будет разместить файлы CSS, изображения и другой статический контент.

Установка разрабатываемой версии Django

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

django/bin
django/contrib/admin
django/contrib/auth
django/contrib/databrowse
django/test

Необходимо будет изменить файл main.py для удаления процедуры загрузки стандартной версии Django и добавления ее копии, включенной в ваше приложение:

import logging, os, sys# Импорт модулей Google App Engine.
from google.appengine.ext.webapp import util# Убираем стандартную версию Django.
for k in [k for k in sys.modules if k.startswith('django')]:
  del sys.modules[k]# Помещаем в начало переменной sys.path каталог со своим приложением
# для того, чтобы затем импортировать оттуда модули.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))# Необходимо установить значение этой переменной окружения до импортирования любого модуля Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcherdef log_exception(*args, **kwds):
 logging.exception('Exception in request:')# Подключить журнал ошибок.
django.dispatch.dispatcher.connect(
   log_exception, django.core.signals.got_request_exception)# Удалить обработчик отката транзакций.
django.dispatch.dispatcher.disconnect(
    django.db._rollback_on_exception,
    django.core.signals.got_request_exception)def main():
  # Создание экземпляра приложения для работы с WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()  # Запустить WSGI CGI обработчик приложения.
  util.run_wsgi_app(application)if __name__ == '__main__':
  main()

Изменение настроек Django

Так как App Engine не поддерживает модели Django, необходимо всем параметрам DATABASE_* присвоить пустые строки. Код, работающий с механизмами авторизации и панелью администрирования, должен быть отключен, так как он требует для работы модели Django. Вся эта функциональность покрывается полностью интерфейсом Users API и Административной консолью соответственно. Аналогично должны быть отключены сессии, которые также зависят от моделей Django. В завершении, необходимо заменить все строки 'project.app' на 'app' и прописать относительный путь к каталогу приложения.

import os
ROOT_URLCONF = 'urls'  # Заменить 'project.urls' строкой 'urls'MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
#    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
)INSTALLED_APPS = (
#    'django.contrib.auth',
    'django.contrib.contenttypes',
#    'django.contrib.sessions',
    'django.contrib.sites',
)ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or
    # "C:/www/django/templates".  Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    ROOT_PATH + '/templates',
)

Использование среды разработки

Среда разработки Google App Engine SDK включает в себя отладочный сервер dev_appserver.py, который можно использовать для тестирования работы приложения Google App Engine. Учтите что, для проведения синхронизации изменений моделей и содержимого хранилища Google App Engine не требуется использование программы manage.py, все это происходит автоматически.

Заключение

Это все! Теперь вы можете писать свои приложения как это обычно делаете при использовании Django.