2012-04-08 3 views
1

В надежде получить комментарий от команды GAE python на этом.GAE SDK 1.6.4 dev_appserver datastore flush

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

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

Затем я мог импортировать свои модели и подключить хранилище данных, модифицировать объекты и выйти.

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

+0

Что-то изменилось. Я спрошу. –

+0

Спасибо Гвидо, я взломал исправление для джанго-нереля. Я подозреваю, что любые другие пользователи python, которые хотят попасть в хранилище данных через оболочку python, будут иметь аналогичную проблему. – dragonx

+0

См. Ответ Альфреда Фуллера на http://stackoverflow.com/questions/10047315/app-engine-local-datastore-content-does-not-persist для объяснения и ссылок на источники. –

ответ

3

Благодаря dragonx для его решения и информации. Я запустил мой devserver из затмения, и я был поражен тем, что мои данные не были сохранены после обновления до 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 

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

+0

Этот код не работает для меня в Windows. Я пробовал запустить приложение на сервере разработки (1) с помощью Eclipse и (2) с помощью Google App Engine Launcher. В любом случае, т. Е. (1) завершение консоли в Eclipse и (2) остановка приложения из панели запуска, транзакции не сохраняются в хранилище данных разработки. Кто-нибудь имеет похожие проблемы в Windows? Кто бы мог подумать об этом? – cv12

+0

Подтверждено, не работает для меня в Windows. –

+0

Я изменил решение для работы в eclipse, сохраняю базу данных каждый раз, как перед обновлением google. – user1325188

2

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

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

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

+0

Если вы используете «python manage.py shell» или «python manage.py createuperuser». Эти случаи раньше не работали. Если вы запустите «python manage.py runningerver», вы получите флеш дважды, один раз из обработчика SDK и один из добавленного дополнительного обработчика.Я не уверен, как отличить выход оболочки python() (пропущен SDK) от SIGTERM/KeyInterrupt (пойманный SDK) – dragonx

+0

спасибо, я не знаю, что я сделал неправильно в своем сообщении, я думаю, что просто копировать и вставлять неправильно, но код в исходном дереве - это то, что у вас было. Я отредактировал его, чтобы исправить это. – dragonx

0

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

После кода:

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

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

+0

Это именно то, что я вижу. Завершение работы с сигналом TERM или KeyInterrupt срабатывает должным образом. Выйти с использованием exit() в оболочке python нет. См. Мой вышеприведенный пост. Оболочка ловит KeyInterrupt, поэтому вы не можете выйти из этого способа при использовании оболочки python. – dragonx

+1

Альфред, не могли бы вы рассказать о том, что должно произойти в Windows? 1.6.4 не стирается ни при остановке py_dev, ни при остановке приложения в Launcher –

Смежные вопросы