3

データストアの書き込みが無効になっているとうまく機能しない Google-Appengine アプリを作成しようとしています

現在、私の main() は次のようになっています。

def main():
    make_datastore_readonly()
    try:
        run_wsgi_app(application)
    except CapabilityDisabledError:
        run_wsgi_app(NoWrite)


メインを次のように設定した場合:

def main():
    run_wsgi_app(application)

例外が発生すると、アプリにトレースバックが表示されます。


メインを次のように設定した場合:

def main():
    run_wsgi_app(NoWrite)

エラーメッセージが適切に表示されます(ただし、すべてのリクエストに対して)。


メインの修正版に戻ります。これは次のとおりです。

def main():
    make_datastore_readonly()
    try:
        run_wsgi_app(application)
    except CapabilityDisabledError:
        run_wsgi_app(NoWrite)

エラー メッセージが表示される代わりに、次のようなトレースバックが表示されます。

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 703, in __call__
    handler.post(*groups)
  File "/Users/kevin/Sche/main.py", line 232, in post
    me.put();
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/db/__init__.py", line 1074, in put
    return datastore.Put(self._entity, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py", line 579, in Put
    return PutAsync(entities, **kwargs).get_result()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore.py", line 556, in PutAsync
    return _GetConnection().async_put(config, entities, local_extra_hook)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1553, in async_put
    return make_put_call(base_req, pbs, extra_hook)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1543, in make_put_call
    self.__put_hook, user_data)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1188, in make_rpc_call
    rpc.make_call(method, request, response, get_result_hook, user_data)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 519, in make_call
    self.__service, method, request, response, self.__rpc)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 207, in Call
    function(service, call, request, response)
  File "/Users/kevin/Sche/main.py", line 18, in hook
    raise CapabilityDisabledError('Datastore is in read-only mode')
CapabilityDisabledError: Datastore is in read-only mode

だから、私の質問は、なぜ例外がキャッチされないのですか?

編集:

この関数は、この StackOverflow の回答からのものです

def make_datastore_readonly():
  """Throw ReadOnlyError on put and delete operations."""
  def hook(service, call, request, response):
    assert(service == 'datastore_v3')
    if call in ('Put', 'Delete'):
      raise CapabilityDisabledError('Datastore is in read-only mode') //Line 18
  apiproxy_stub_map.apiproxy.GetPreCallHooks().Push('readonly_datastore', hook, 'datastore_v3')
4

1 に答える 1

2

main関数はこのアプリケーションのみを登録します。したがって、main関数で例外が発生することはありません。したがって、try ... catchステートメントは機能しません。

この例外を処理する方法は、新しいRequestHandlerを定義することです。次に、この機能を必要とするすべてのリクエストは、新しいRequestHandlerに固有のものである必要があります。

例えば:

Class MyRequestHandler(RequestHandler):
    def get(self):
        try:
            self.get_handler()
        except CapabilityDisabledError:
            pass

class MyRequest(MyRequestHandler):
    def get_handler(self):
        # ....
        pass
于 2012-08-19T02:11:42.270 に答える