Python Google应用程序引擎Api和端点版本控制
我在寻找处理多个问题的正确方法时遇到了一些困难 我的应用程序中的remote.Service api版本Python Google应用程序引擎Api和端点版本控制,python,google-app-engine,google-cloud-endpoints,Python,Google App Engine,Google Cloud Endpoints,我在寻找处理多个问题的正确方法时遇到了一些困难 我的应用程序中的remote.Service api版本 class MyService(Service): @endpoints.method( endpoints.ResourceContainer( something=protorpc.messages.StringField(1, required=True), ), message_types.VoidMess
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
@endpoints.method(
endpoints.ResourceContainer(
some_other_name=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
尝试创建库时,我遇到以下错误:
protorpc.remote.ServiceDefinitionError:不使用方法装饰器
重载远程方法时,请在服务MyBetterService上执行操作。
在下一个版本的API中有没有重写方法的方法
重写的方法是否可以接受其他请求参数
是否有可能在现有api中只添加一个不同版本的端点?端点服务类的编写方式是,一旦定义了公共接口方法,就不能在子类中更改它们。通常,您不应该将一个类的新API版本定义为子类,除非它是一个精确的超类,并设置了该超类的接口 在新版本为超集的情况下,可以使用重定义接口方法,该方法将自动继承父方法的属性。例如:
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_more_stuff(self, request):
... implement do_more_stuff ...
from mysystem import MyImplementation
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(request.something)
class MyBetterService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(self.lookup_string(request.something))
无法更改do\u stuff()
的输入类型
在实践中,新的API版本应被视为与新的API相同,并具有独立的服务类定义。将API真正视为一个接口。虽然两个类不应该共享具有公共API方法定义的基类,但这并不意味着两个类现在可以共享一组公共的函数类
当我构建服务时,我将API版本实现为单独的类,即使我不得不复制许多方法签名。然而,在服务下面,我实现了一个对象系统,它完全独立于接口和API消息类型执行相同的操作。这允许两个API版本共享实现的重要部分
例如:
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
... implement do_stuff ...
class MyBetterService(MyService):
def do_stuff(self, request):
# ...other way of doing stuff
return message_types.VoidMessage()
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_more_stuff(self, request):
... implement do_more_stuff ...
from mysystem import MyImplementation
class MyService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.StringField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(request.something)
class MyBetterService(Service):
@endpoints.method(
endpoints.ResourceContainer(
something=protorpc.messages.IntegerField(1, required=True),
),
message_types.VoidMessage,
)
def do_stuff(self, request):
MyImplementation.do_stuff(self.lookup_string(request.something))
在这个模型中,我认为API负责在服务接口和实际底层系统之间封送信息,而不是实际的实现
虽然为每个新的实现显式地复制每个方法似乎需要做很多工作,但实际上它通常只是整个服务应该做的工作的一小部分。在第二个示例中,应该有
类MyBetterService(service):
,但我认为这是最好的解决方案。