1

これについてGAEpythonチームからコメントをもらいたいと思っています。

アプリの終了時にdev_appserverデータストアがディスクにフラッシュされる方法に関して、1.6.3と1.6.4の間で何か変更がありますか?

私はdjango-nonrelを使用しており、1.6.3以前では、pythonシェルをロードできました:python manage.pyシェル(manage.pyはdjango-nonrelによって提供されます)

次に、モデルをインポートしてデータストアにアクセスし、エンティティを変更して、終了することができます。

1.6.4ではそれができますが、終了すると変更がデータストアに保存されません。django-nonrelをWSGIアプリとして実行すると、正しく保存され、終了時にメッセージが表示されます(「保留中のすべてのトランザクションを適用してデータストアを保存する」)。

4

3 に答える 3

3

彼の解決策と情報についてdragonxに感謝します。Eclipse から devserver を実行していますが、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

リリース ノートに記載されているような動作の変更について知らせてくれれば、アップグレードで何が問題だったのかを探すのに 2 日もかからなかったでしょう。

于 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より前では、書き込みのたびにデータストアを保存していました。この方法は、高レプリケーションデータストアにあるトランザクションモデルをシミュレートする場合は機能しません(最後の数回の書き込みが失われます)。また、ひどく非効率的です。データストア開発スタブがすべての書き込みをフラッシュし、シャットダウン時にその状態を保存するように変更しました。

コードに従う:

  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 に答える