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

Описание общих принципов разработки

Как можно обновить информацию в хранилище?

Метод put() моделей хранилища позволяет как создавать новые объекты, так и сохранять изменения, произведенные над существующими.

К примеру, мы хотим предоставить пользователям иметь возможность изменять свои комментарии в нашем учебном приложении - гостевой книге. Для этого мы можем запросить существующий комментарий из хранилища, заменить его содержимое новым текстом и сохранить эти изменения как показано ниже:

# Например, наша модель для комментариев может выглядеть наподобие этой
class Comment(db.Model):
  comment_author = db.UserProperty()
  comment_text = db.TextProperty()
class UpdateComment(BaseRequestHandler):
  def post(self):
    # Предложим, что через HTTP POST-запрос мы получаем обновленный комментарий в поле comment
    updated_comment = self.request.get('comment')
    current_user = users.GetCurrentUser()
    # Запрос на получение ранее сохраненного комментария 
    comment_query = Comment.gql('WHERE comment_author = :1', current_user)
    # Запрашиваем результат из хранилища
    comment_result = comment_query.fetch(1)
    if comment_result:
      comment = comment_result[0]
    else:
      logging.error('Could not find comment')    # Присваиваем объекту comment новый текст комментария
    comment.comment_text = db.Text(updated_comment)
    # Сохраняем обновленный объект с комментарием в хранилище
    comment.put()

Могу ли я выполнять свои обычные MySQL запросы?

Хранилище платформы Google App Engine использует нереляционную объектную модель для сохранения данных, которая позволяет создавать быстрые и масштабируемые приложения. Так как метод хранения данных отличается от реляционных баз, таких как MySQL, не вся функциональность традиционных баз данных, к которой мы уже привыкли, доступа в системе. К примеру, хранилище не может выполнять объединения (join) таблиц, которое является базовой возможностью реляционной базы данных.

Однако, мы имеем возможность производить CRUD-операции (создания, запроса, изменения и удаления данных), и выполнять выборки с использованием собственного языка запросов GQL. Также возможно воспользоваться классом Query, который предоставляет использование фильтров и сортировок для получаемых данных путем построения последовательных конструкций.

Фильтры позволяют накладывать ограничения на результаты, получаемые из хранилища с помощью традиционных операторов сравнения: < <= = >= >

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

В завершении, при запросе данных из хранилища можно указать ограничение числа результатов (limit) и их смещение от первого элемента (offset). Значение limit - это максимальное число результатов, которое может выдать запрос. Значение offset указывает, сколько объектов с начала набора данных следует пропустить при выдаче результатов.

Какие сторонние библиотеки можно использовать вместе с моим приложением?

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

Возможно ли использовать фреймворк Django с Google App Engine?

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

Как можно импортировать другую версию модуля, который уже включен в поставку Google App Engine?

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

До того, как будет осуществляться импорт этого модуля, необходимо удалить все ссылки на старую версию модуля в переменной sys.modules и добавить каталог приложения в начало переменной sys.path. Ниже представлен пример того, как можно импортировать собственную версию системы Django, вместо той, которая включена в поставку Google App Engine:

# Убрать предустановленную версию Django
for key in [key for key in sys.modules if key.startswith('django')]:
  del sys.modules[key]

Поместить каталог приложения в начало переменной sys.path:

# Использовать для sys.path собственный список каталогов, поместив в начало переменной каталог приложения
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

Как можно выполнить профилирование моего приложения?

Для изучения производительности вашего приложения, сначала измените название основной функции main() на real_main(). Затем, добавьте новую функцию в приложение, названную profile_main() по примеру ниже:

def profile_main():
 # Это замена функции main() для профилирования 
 # Мы переименовали оригинальную функцию main() в real_main()
 import cProfile, pstats
 prof = cProfile.Profile()
 prof = prof.runctx("real_main()", globals(), locals())
 print "<pre>"
 stats = pstats.Stats(prof)
 stats.sort_stats("time")  # Или cumulative
 stats.print_stats(80)  # 80 = сколько строк выводить
 # Остальное необязательно.
 # stats.print_callees()
 # stats.print_callers()
 print "</pre>"

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

def profile_main():
 # Это замена функции main() для профилирования 
 # Мы переименовали оригинальную функцию main() в real_main()
 import cProfile, pstats, StringIO
 prof = cProfile.Profile()
 prof = prof.runctx("real_main()", globals(), locals())
 stream = StringIO.StringIO()
 stats = pstats.Stats(prof, stream=stream)
 stats.sort_stats("time")  # Или cumulative
 stats.print_stats(80)  # 80 = сколько строк выводить
 # Остальное необязательно.
 # stats.print_callees()
 # stats.print_callers()
 logging.info("Profile data:\n%s", stream.getvalue())

Информацию в журнале ошибок можно просмотреть через Административную консоль. Для дополнительной информации о ведении журнала ошибок, смотрите следующий раздел.

Теперь для того чтобы включить профилирование приложения, установите main = profile_main. Для отмены и запуска в нормальном режиме достаточно будет указать main = real_main.

(Обратите внимание, что класс cProfile был добавлен только в версию 2.5 языка Python, которая настоятельно рекомендуется к использованию, так как на ней работают опубликованные приложения App Engine. Если вы используете более рание версии языка Python, у вас не будет возможности включить профилирование на локальном компьютере разработчика.)

При запуске приложения, которое использует Django, я получаю сообщение об ошибке со словами "ROOT_URLCONF is not found".

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

from django.conf import settings
settings._target = None