2

Pythonを使用して、AppEngineアプリのremote_apiハンドラーに接続しようとしていますが、エラーが発生し続けます。私がやりたいのは、remote_apiスタブを設定して、データベース呼び出しをルーティングし、アプリのデータストアに直接アクセスすることです。そのため、最初にremote_apiライブラリをインポートしてから、スタブモジュールでConfigureRemoteApiを呼び出し、リモートデータストアへの呼び出しを使用してみます。サンプルコードは次のとおりです。

from google.appengine.ext.remote_api import remote_api_stub

def test_remote_api():
    # This function is called when I want to use the remote api instead of the local datastore access
    remote_api_stub.ConfigureRemoteApi('myapp.appspot.com', '/_ah/remote_api', auth_func, '')

def auth_func:
    # This actually returns a tuple with my credentials to skip the console input
    return ('username', 'password')

これで、ログイン情報とアプリ名をremote_api_shell.pyでテストしましたが、次のようなエラーが発生します。

File "C:\Program Files(x86)\Google\google_appengine\google\appengine\tools\dev_appserver_blobstore.py", line 79, in GetBlobStorage
return apiproxy_stub_map.apiproxy.GetStub('blobstore').storage
AttributeError: 'RemoteStub' object has no attribute 'storage'

そして、404:Not Found from the applicationを取得します。これは、Webからアプリにアクセスすると結果が得られるため、間違っていることがわかっています。このエラーが発生しないように、remote_api_stubを設定するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

6

現在、高レプリケーションデータストアを使用していると仮定します...

app_idが間違っている可能性があり、addressパラメーターも渡す必要があります。appengineのoreillyの本を読んでいる間、私はこれをしばらく前に泡立てました(本はひどく時代遅れであり、推奨されていません)

def attach_to_app(app_id, user=None, password=None, path=None, address=None):
    """
    attaches to app_id instance at address (default: <app_id>.appspot.com)

    if you don't specify a user/password you will be prompted for one

    if you don't specify an address it is assumed to be
    <app_id>.appspot.com

    path: path to remote_api handler, if not
    specified, will use /_ah/remote_api 
    """
    path = path or "/_ah/remote_api"

    if not address:
        address = "%s.appspot.com" % app_id

    init_remote_api(app_id, path, address, user=user, password=password)




def auth_func():
    """
    function to prompt user for credentials
    """
    email_address = raw_input("Email Address: ")
    password = getpass.getpass("Password: ")
    return email_address, password


def init_remote_api(app_id, path, address, user=None, password=None):
    """
    generic wrapper to initialize the remoteapi for a given path

    required
    =========
    app_id : the app_id of the application to connect to
    path: the path to the remote_api handler ex: /_ah/remote_api
    address: server to connect to ex: myapp.appspot.com

    if user and password are not specified you will be prompted on
    connection if needed
    """
    if user and password:
        def my_auth():
            return (user, password)
    else:
        my_auth = auth_func

    remote_api_stub.ConfigureRemoteApi(app_id, path, my_auth, address)
    remote_api_stub.MaybeInvokeAuthentication()
    os.environ["SERVER_SOFTWARE"] = "Development (remote_api)/1.0"

# example
APP_ID = "s~myapp" # when hrds was introduced it became necessary to specify app_id and address note the "s~..."
ADDRESS = "myapp.appspot.com"
attach_to_app(APP_ID, address=ADDRESS)
于 2012-09-13T20:42:55.517 に答える
1

データストアへのアクセスのみに関心がある場合は、testBedでスタブエラーを回避できます

# First, create an instance of the Testbed class.
myTestBed = testbed.Testbed()

# Then activate the testbed, which prepares the service stubs for use.
myTestBed.activate()

# Next, declare which service stubs you want to use.
myTestBed.init_blobstore_stub()
myTestBed.init_logservice_stub()
于 2013-07-22T13:01:39.563 に答える