希望得到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应用程序运行时,它会正确保存,并在退出时看到一条消息(“应用所有待处理的事务并保存数据存储区”)。
答案 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存储库刷新所有写入并在关闭时保存其状态。
遵循代码:
如果服务器干净地关闭(使用TERM信号或KeyInterrupt),看起来manage.py应该可以工作。