Метод 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()
Хранилище платформы Google App Engine использует нереляционную объектную модель для сохранения данных, которая позволяет создавать быстрые и масштабируемые приложения. Так как метод хранения данных отличается от реляционных баз, таких как MySQL, не вся функциональность традиционных баз данных, к которой мы уже привыкли, доступа в системе. К примеру, хранилище не может выполнять объединения (join) таблиц, которое является базовой возможностью реляционной базы данных.
Однако, мы имеем возможность производить CRUD-операции (создания, запроса, изменения и удаления данных), и выполнять выборки с использованием собственного языка запросов GQL. Также возможно воспользоваться классом Query, который предоставляет использование фильтров и сортировок для получаемых данных путем построения последовательных конструкций.
Фильтры позволяют накладывать ограничения на результаты, получаемые из хранилища с помощью традиционных операторов сравнения: < <= = >= >
Операции сортировки позволяют изменить порядок получения данных из запросов. Для дополнительной информации о том, какие операторы доступны для каждого типа данных смотрите здесь.
В завершении, при запросе данных из хранилища можно указать ограничение числа результатов (limit) и их смещение от первого элемента (offset). Значение limit - это максимальное число результатов, которое может выдать запрос. Значение offset указывает, сколько объектов с начала набора данных следует пропустить при выдаче результатов.
Вы можете использовать любую стороннюю библиотеку, написанную на чистом языке Python, в вашем приложении Google App Engine. Для того, чтобы задействовать библиотеку, достаточно включить ее файлы в каталог с приложением, после чего они будут загружены на сервер вместе с ним. Вы можете импортировать файлы библиотеки так же, как если бы это были собственные файлы вашего приложения.
Конечно. Мы разместили вводную статью, объясняющую как начать разработку с Google App Engine на Django.
Если вам необходимо импортировать собственную версию модуля, уже включенного в поставку 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, у вас не будет возможности включить профилирование на локальном компьютере разработчика.)
Так как фреймворк webapp, поставляемый с Google App Engine, использует шаблонную систему Django, при его загрузке происходит частичная инициализация Django. Это приводит к тому, что в дальнейшем загрузка модуля с настройками settings будет пропущена. Если вы получаете эту ошибку, то необходимо явно указать необходимость Django перезагрузить свои настройки:
from django.conf import settings settings._target = None