0

クラウド エンドポイントをアプリに組み込もうとしています。現在、概念実証のために Python クイックスタートを使用しています。カードをグラスに送るメソッドを呼び出そうとすると問題が発生します。以下は私のコードです。インデントがないことは無視してください。

@endpoints.api(name='tasks', version='v1',
description='API for TaskAlert Management',
allowed_client_ids=[CLIENT_ID, endpoints.API_EXPLORER_CLIENT_ID])
class TaskAlertApi(remote.Service):
@endpoints.method(Task, Task,
name='task.insert',
path='tasker',
http_method='POST')
def insert_task(self, request):

TaskModel(author=request.author, content=request.content, date=request.date).put()
themirror = MainHandler()

themirror._insert_map_with_distance_from_home()

return request

したがって、「themirror._insert_map_with_distance_from_home()」が呼び出されると、次のエラーが発生します。誰か提案はありますか?これを myappspot.com/_ah/api/explorer から呼び出そうとしています。

in _insert_map_with_distance_from_home
    self.mirror_service.timeline().insert(body=body).execute()
AttributeError: 'MainHandler' object has no attribute 'mirror_service'
4

1 に答える 1

2

このためにコードをかなり再考する必要があると思いますが、ここで基本を説明しようと思います。

主な問題は、MainHandler が実際に HTTP 要求を受信するときにかなりの処理を行うことです。最も重要なことは、現在のユーザーに対して認証されたを実際に作成する@util.auth_requiredMainHandler のメソッドのデコレータで何が起こるかです。コードから MainHandler に直接アクセスすると、これは実際には発生しないため、利用可能なものはありません (エラーが発生します)。getmirror_servicemirror_service

エンドポイントが呼び出される方法は、通常の RequestHandler が呼び出される方法とはかなり異なるため、保存されたセッション資格情報などに依存して、エンドポイント ユーザーとミラー ユーザーを照合することもできません。

mirror_service基本的に、エンドポイント メソッド内に新しいメソッドを作成する必要があります。

このためには、認証された API を呼び出す必要があります (Mirror API スコープを認証スコープに追加します)。次に、リクエスト ヘッダーから used を抽出し、access_tokenこの access_token を使用して OAuth2Credentials を作成し、mirror_service を作成します。

実際のコードを知らずに判断するのは難しいため、完全性を保証しないコード スニペットをいくつか示します。

import os
from oauth2client.client import AccessTokenCredentials

# extract the token from request
if "HTTP_AUTHORIZATION" in os.environ:
    (tokentype, token)  = os.environ["HTTP_AUTHORIZATION"].split(" ")

# create simple OAuth2Credentials using the token
credentials = AccessTokenCredentials(token, 'my-user-agent/1.0')

# create mirror_service (using the method from util.py from the quickstart(
mirror_service = create_service('mirror', 'v1', credentials)

もちろん、_insert_map_with_distance_from_homeこの mirror_service オブジェクトを使用するように も変更する必要がありますが、このコンテキストでは、このメソッドを MainHandler から移動する方が理にかなっています。

于 2013-10-24T01:01:04.557 に答える