GAE SDK 1.6.4 dev_appserver数据存储区刷新

时间:2012-04-08 03:33:30

标签: python google-app-engine django-nonrel

希望得到GAE python团队对此的评论。

关于在应用程序退出时将dev_appserver数据存储区刷新到磁盘的方式,1.6.3,1.6.4之间是否有变化?

我正在使用django-nonrel,而在1.6.3之前,以前,我曾经能够加载python shell:     python manage.py shell(manage.py由django-nonrel提供)

然后我可以导入我的模型并加入数据存储区,修改实体并退出。

在1.6.4上,我能够这样做,但是当我退出时,更改不会保存到数据存储区。当我将django-nonrel作为WSGI应用程序运行时,它会正确保存,并在退出时看到一条消息(“应用所有待处理的事务并保存数据存储区”)。

3 个答案:

答案 0 :(得分:3)

感谢dragonx的解决方案和信息。 我从eclipse运行我的devserver,看到升级到1.6.4后我的数据没有被保存,我很惊讶 我在每个Web请求之后向数据库添加了一个flush,为此我为所有请求实现了一个基类并覆盖了dispatch:

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

通知发布说明中的行为更改,可以节省我两天的时间来搜索升级中出现的问题。

答案 1 :(得分:2)

看起来有些变化。我已经能够通过以下方式解决问题:

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

这可确保在退出时刷新数据存储区。

答案 2 :(得分:0)

在1.6.4之前,我们在每次写入后都保存了数据存储区。在模拟High Replication数据存储区中找到的事务模型时,此方法不起作用(您将丢失最后几次写入)。它也非常低效。我们对其进行了更改,以便数据存储区dev存储库刷新所有写入并在关闭时保存其状态。

遵循代码:

  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
  3. 如果服务器干净地关闭(使用TERM信号或KeyInterrupt),看起来manage.py应该可以工作。