Платформа Google App Engine и фреймворк Django умеют использовать для своей работы один и тот же стандарт WSGI. В результате появляется отличная возможность использовать платформу и фреймворк, включая его связующее программное обеспечение. Разработчику необходимо будет выполнить платформенные изменения и привести все модели Django к использованию масштабируемого хранилища Google App Engine. Так как и Django и Google App Engine имеют общую концепцию моделей для хранения данных, вы сможете быстро перевести ваше приложение на использование хранилища Google.
В состав платформы Google App Engine включен Django версии 0.96, который является одним из последних стабильных релизов. Для работы достаточно будет выполнить простое импортирование модулей Django. Далее по тексту мы рассмотрим, что необходимо сделать, если вы захотите использовать для работы приложения нестабильную разрабатываемую версию Django.
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.dispatcher
def 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: 1 handlers: - url: /static static_dir: static - url: /.* script: main.py
В каталоге static можно будет разместить файлы CSS, изображения и другой статический контент.
Для использования текущей версии, скачайте целиком пакет с фреймворком 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.dispatcher
def 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 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.