我正在尝试将云端点合并到我的应用中,我目前正在使用Python Quickstart进行概念验证。当我尝试拨打方法将卡片发送到我的杯子时,我遇到了问题。下面是我的代码,请忽略缩进缺失。
@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'
答案 0 :(得分:2)
我担心你不得不重新考虑你的代码,但我会尝试在这里解释基础知识。
主要问题是MainHandler在实际接收HTTP请求时会做很多事情。最重要的是在MainHandler的@util.auth_required
方法的get
装饰器中发生的事情,该方法实际创建了mirror_service
,为当前用户进行了身份验证。当您直接从代码访问MainHandler时,实际上没有发生这种情况,因此没有mirror_service
可用(这会导致错误)。
由于调用端点的方式与调用普通RequestHandler的方式完全不同,因此您也不能依赖存储的会话凭据或类似内容来匹配端点用户与镜像用户。
基本上你要做的就是在你的端点方法中创建一个新的mirror_service
。
为此,您必须调用您的API进行身份验证(将Mirror API范围添加到身份验证范围)。然后,您可以从请求标头中提取已使用的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移开会更有意义。