1

希望得到 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 应用程序运行时,它会正确保存,并且我在退出时看到一条消息(“应用所有待处理的事务并保存数据存储区”)。

4

3 回答 3

3

感谢 Dragonx 的解决方案和信息。我从 Eclipse 运行我的开发服务器,我很惊讶地看到我的数据在升级到 1.6.4 后没有保存我在每个 Web 请求后向数据库添加了一个刷新,为此我为所有请求实现了一个基类并覆盖调度:

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

在发行说明中告知类似行为的变化,我可以节省两天时间搜索升级中出现的问题。

于 2012-04-10T22:18:20.697 回答
2

似乎发生了一些变化。我已经能够解决以下问题:

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

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

于 2012-04-08T04:11:22.313 回答
0

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

按照代码:

  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

如果服务器完全关闭(使用 TERM 信号或 KeyInterrupt),那么 manage.py 应该可以工作。

于 2012-04-08T05:30:37.960 回答