<p>不幸的是,这个问题也不可能。方法装饰器需要请求描述(<code>PostMessageCollection</code>这里)。子类化<code>message.Message</code>的请求描述不允许通过继承重用,因此所有的消息类都必须在没有任何继承的情况下完整地定义。在</p>
<p>不过,我现在还不能达到这样的程度:</p>
<pre><code># All the message and response definitions have to be here, complete.
class PostMessage(messages.Message):
id = messages.StringField(1)
title = messages.StringField(2)
body = messages.StringField(3)
class PostMessageCollection(messages.Message):
post_messages = messages.MessageField(PostMessage, 1, repeated=True)
def post_to_message(post):
return PostMessage(
id=str(post.key()),
title=post.title,
body=post.body)
ID_RESOURCE = endpoints.ResourceContainer(
message_types.VoidMessage,
id=messages.StringField(1, variant=messages.Variant.STRING))
PUT_RESOURCE = endpoints.ResourceContainer(
PostMessage,
id=messages.StringField(1, variant=messages.Variant.STRING))
POST_RESOURCE = endpoints.ResourceContainer(Post)
# Now define all the 'Category' related messages here.
@endpoints.api(name='posts_n_categories', # The name can be a common one.
version='v1',
allowed_client_ids=[WEB_CLIENT_ID, ANDROID_CLIENT_ID, IOS_CLIENT_ID],
audiences=[ANDROID_AUDIENCE])
class BaseAPI(remote.Service):
"""List"""
# Common defs go here.
MessageCollection = messages.Message
PATH = '/'
NAME = ''
@staticmethod
def converter(x):
raise NotImplemented
iterator = []
collection = messages.Message
@endpoints.method(message_types.VoidMessage,
MessageCollection,
path=PATH,
http_method='GET',
name=NAME)
def list(self, unused_request):
# Do the common work here. You can
_messages = []
for post in self.__class__.iterator.all():
_messages.append(self.__class__.converter(post))
return self.__class__.collection(post_messages=_messages)
@endpoints.api(name='posts', # The name can be different.
version='v1',
allowed_client_ids=[WEB_CLIENT_ID, ANDROID_CLIENT_ID, IOS_CLIENT_ID],
audiences=[ANDROID_AUDIENCE])
class PostAPI(Base):
# Post specific defs go here.
MessageCollection = PostMessageCollection
PATH = '/posts'
NAME = 'posts.listPosts'
converter = post_to_message
iterator = Post
collection = PostCollection
# Define the category class here.
</code></pre>
<p>显然,这并不能节省多少时间。在</p>