Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Google应用程序引擎Api和端点版本控制_Python_Google App Engine_Google Cloud Endpoints - Fatal编程技术网

Python Google应用程序引擎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

我在寻找处理多个问题的正确方法时遇到了一些困难 我的应用程序中的remote.Service 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):
    @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):
,但我认为这是最好的解决方案。