GAE SDK 1.6.4 dev_appserver Сброс хранилища данных

Надеемся получить комментарий от команды разработчиков GAE по этому вопросу.

Что-то изменилось между 1.6.3, 1.6.4 относительно способа, которым хранилище данных dev_appserver записывается на диск при выходе из приложения?

Я использую django-nonrel, и на 1.6.3, и раньше я мог загружать оболочку Python:     оболочка Python manage.py (manage.py предоставляется django-nonrel)

Затем я мог бы импортировать свои модели и принять хранилище данных, изменить сущности и выйти.

На 1.6.4 я могу это сделать, но когда я ухожу, изменения не сохраняются в хранилище данных. Когда я запускаю django-nonrel как приложение WSGI, оно сохраняется правильно, и я вижу сообщение о выходе («Применение всех ожидающих транзакций и сохранение хранилища данных»).

 Guido van Rossum08 апр. 2012 г., 06:07
Что-то изменилось. Я спрошу вокруг.
 dragonx08 апр. 2012 г., 06:20
Спасибо Гвидо, я взломал исправление для django-nonrel. Я подозреваю, что любые другие пользователи Python, которые хотят получить доступ к хранилищу данных через оболочку Python, столкнутся с подобной проблемой.
 Guido van Rossum08 апр. 2012 г., 16:40
См. Ответ Альфреда Фуллера наstackoverflow.com/questions/10047315/… для объяснения и ссылки на источник.
 dragonx09 апр. 2012 г., 01:24
@Guido Как насчет обработки exit () из оболочки? Это не отправляет сигнал TERM или KeyInterrupt. Правильно ли использовать atexit, как в моем ответе ниже?

Ответы на вопрос(3)

Похоже, произошли некоторые изменения. Мне удалось решить проблему с помощью следующего:

from google.appengine.tools import dev_appserver
import atexit
atexit.register(dev_appserver.TearDownStubs)

Это гарантирует, что хранилище данных сбрасывается при выходе.

 dragonx09 апр. 2012 г., 02:45
Если вы запускаете "оболочку python manage.py" & quot; или "Python manage.py создает пользователя". Эти случаи не работали раньше. Если вы запустите «python manage.py runserver», вы получите сброс дважды: один раз из обработчика SDK и один из добавленного мной дополнительного обработчика. Я не совсем уверен, как отличить exit () оболочки Python (пропущенный SDK) от SIGTERM / KeyInterrupt (перехваченный SDK)
 dragonx11 апр. 2012 г., 07:21
спасибо, я не знаю, что я сделал неправильно в своем посте, я думаю, что я просто скопировал и вставил неправильно, но код в моем исходном дереве - это то, что у вас было. Я отредактировал это, чтобы исправить это.

До 1.6.4 мы сохраняли хранилище данных после каждой записи. Этот метод не работает при моделировании транзакционной модели, найденной в хранилище данных с высокой репликацией (вы потеряете последнюю пару записей). Это также ужасно неэффективно. Мы изменили его так, что заглушка разработчика хранилища данных сбрасывает все записи и сохраняет его состояние при выключении.

После кода:

https://bitbucket.org/wkornewald/djangoappengine/src/60c2b3339a9f/management/commands/runserver.py#cl-154 http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_main.py#683

Похоже, что manage.py должен работать, если сервер полностью выключен (с помощью сигнала TERM или KeyInterrupt).

 dragonx08 апр. 2012 г., 16:12
Это именно то, что я вижу. Выключение с помощью сигнала TERM или KeyInterrupt правильно мигает. Выход с использованием exit () в оболочке Python не позволяет. Смотрите мой пост выше. Оболочка ловит KeyInterrupt, поэтому вы не можете выйти таким образом при использовании оболочки Python.
 18 апр. 2012 г., 12:30
Альфред, можете ли вы рассказать, что должно происходить в Windows? 1.6.4 не сбрасывается ни при остановке отладки py_dev, ни при остановке приложения в панели запуска
Решение Вопроса

Спасибо dragonx за его решение и информацию. Я запускаю свой devserver из Eclipse, и я был поражен, увидев, что мои данные не сохраняются после обновления до 1.6.4 Я добавил сброс в базу данных после каждого веб-запроса, для этого я реализовал базовый класс для всех запросов и переопределил диспетчеризацию:

developmentServer = False

if os.environ.get('SERVER_SOFTWARE','').startswith('Development'):
    developmentServer = True

class BaseRequestHandler(webapp2.RequestHandler):
    def dispatch(self):
        retValue = super(BaseRequestHandler, self).dispatch()
        if developmentServer:
                from google.appengine.tools import dev_appserver 
                dev_appserver.TearDownStubs()

        return retValue

информирование об изменениях в поведении в примечаниях к выпуску избавило бы меня на два дня на поиск того, что пошло не так в моем обновлении.

 18 апр. 2012 г., 12:06
Подтвердил, у меня не работает на Windows.
 22 апр. 2012 г., 08:14
Я изменил решение, чтобы работать в Eclipse, сохранять базу данных каждый раз, как до обновления Google
 22 апр. 2012 г., 11:17
Наконец, я создал кнопку в моем приложении, которая посылает флеш при нажатии
 18 апр. 2012 г., 07:08
Этот код выше не работает для меня в Windows. Я пытался запустить приложение на сервере разработки (1) с помощью Eclipse и (2) с помощью Google App Engine Launcher. В любом случае, то есть (1) завершение консоли в Eclipse и (2) остановка приложения из модуля запуска, транзакции не сохраняются в хранилище данных разработки. У кого-нибудь есть похожие проблемы в Windows? Кто-нибудь, кто мог бы предложить некоторые мысли по этому поводу?

Ваш ответ на вопрос