我正在尝试使用Google的Protocol Buffers来描述RPC服务
service WhoamiService {
rpc WhoAreYou() returns (Whoami) {}
}
message Whoami {
optional bytes request_id = 1;
optional string hostname = 2;
optional string message = 3;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译这个定义时,我得到一个Expected type name指向该WhoAreYou()片段的错误.
它工作正常,如果我取代WhoAreYou()用WhoAreYou(Whoami),但在这种情况下,该方法不需要任何参数.是有办法做到这一点还是根本不支持?
我在Visual Studio Code中使用pylint来开发Python中的Google App Engine(GAE)Cloud Endpoint API.我无法解决lint错误.我不知道是什么导致了错误,但是猜测,pylint找不到库?protorpc
故障排除Linting中的建议修复是将工作空间设置配置为指向完全限定的python可执行文件.我已经这样做了,但皮棉错误仍然存在.
protorpc 本身安装到:
~/google-cloud-sdk/platform/google_appengine/lib/protorpc-1.0/protorpc
Run Code Online (Sandbox Code Playgroud)
...这包含remote.py无法导入的模块:
__init__.py generate_python.py protojson.py transport.py
definition.py google_imports.py protourlencode.py util.py
descriptor.py message_types.py registry.py webapp
generate.py messages.py remote.py wsgi
generate_proto.py protobuf.py static
Run Code Online (Sandbox Code Playgroud)
我已将此路径添加到$PYTHONPATH(与厨房水槽一起):
export GOOGLE_CLOUD_SDK=~/google-cloud-sdk
export APPENGINE_PATH=$GOOGLE_CLOUD_SDK/platform/google_appengine
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK/lib
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK/lib/googlecloudsdk
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK/lib/googlecloudsdk/api_lib
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK/platform/google_appengine/lib
export PYTHONPATH=$PYTHONPATH:$GOOGLE_CLOUD_SDK/platform/google_appengine/lib/protorpc-1.0/protorpc
Run Code Online (Sandbox Code Playgroud)
应用程序在本地运行,也在部署时运行,因此这似乎只是一个lint错误,但令人沮丧的是我无法解决它.
使用第三方库声明:
标准环境中的Python运行时包括Python标准库,App Engine库和一些捆绑的第三方软件包.
因此,我认为 "App Engine库"包括protorpc,但我不确定.此外,将Cloud Endpoints Frameworks库添加到示例API …
protorpc当我使用端点时,我会收到一些奇怪的错误.在这段代码中:
class Application(EndpointsModel):
_message_fields_schema = ('id', 'name')
created = ndb.DateTimeProperty(auto_now_add=True)
name = ndb.StringProperty()
roles = ndb.IntegerProperty(repeated=True)
updated = ndb.DateTimeProperty(auto_now=True)
owner = ndb.KeyProperty(kind='User')
@API.api_class(resource_name="application")
class ApplicationApi(protorpc.remote.Service):
@Application.method(http_method="GET",
request_fields=('id',),
name="get",
path="applications/{id}")
def ApplicationGet(self, instance):
if not instance.from_datastore:
raise endpoints.NotFoundException("Application not found.")
return instance
@Application.query_method(http_method="GET",
query_fields=('limit', 'order', 'pageToken'),
name="list",
path="applications")
def ApplicationList(self, query):
return query
Run Code Online (Sandbox Code Playgroud)
当我调用application.get()错误时如下:( 完全跟踪):
TypeError:只能从确切类型为Application的实体进行复制.收到了一个Application实例.
并且调用application.list()错误如下:( 完全跟踪):
ValidationError:
<class '.Application'>找到的字段项的预期类型<Application name: u'test'>(类型<class '.Application'>)
可能是什么导致了这个?我的其他模型具有几乎相同的代码(只是不同的属性)工作正常.
python google-app-engine protorpc google-cloud-endpoints endpoints-proto-datastore
在Python脚本中mylibrary.py,我使用Protocol Buffers来使用以下方法对数据建模:
我想实现在App Engine云端点框架是imports和使用上述Python脚本,但是云端点使用ProtoRPC的,不是"标准" 协议缓冲区.
我的App Engine Python模块从而不是使用'offline' 编译器main.py导入以生成序列化和反序列化代码:protorpcprotoc
from protorpc import messages
from protorpc import remote
Run Code Online (Sandbox Code Playgroud)
消息未使用.proto文件定义.而是定义类,继承自protorpc.messages.Message:
class MyMessageDefinition(messages.Message)
Run Code Online (Sandbox Code Playgroud)
Proto Buffers可以转换为Proto RPC等价物吗?我真的不想改为mylibrary.py使用ProtoRPC,因为它不像Protocol Buffers那样通用.
我有一个webservice应该从调用者读取列表,做一些工作,然后返回一个响应.
@endpoints.method(ARequestMessage, AResponseMessage,
name="call", path="call")
def call(self, request):
aList = request.in_list
for stuff in aList:
"do work here"
return when I am done
Run Code Online (Sandbox Code Playgroud)
以下ARequestMessage课程会起作用吗?
class ARequestMessage(messages.Message):
name = messages.StringField(1, required=True)
in_list = messages.FieldList(2, required=True)
Run Code Online (Sandbox Code Playgroud)
我不确定我FieldList在结构或上下文中的用法.请包含一些代码作为回应.
google-app-engine python-2.7 protorpc google-cloud-endpoints
我主要在工作中处理REST json API.所以我熟悉他们.但对于我自己的项目,我正在尝试app引擎,因为我认为它非常合适.
我已经开始在python中编写我的逻辑(使用ferris),并且在阅读更多应用程序引擎时,我遇到了protorpc和云端点.但在我读过的大部分例子中,他们似乎都在做同样的事情,就像在休息api中做的那样.用json发出请求,然后获得json响应.或者是错误.
我看到的主要区别在于,在休息时,端点基于资源.并且围绕它们的HTTP动词,例如GET,POST,PUT,DELETE等.在RPC中,每个请求都有自己的端点,而不是基于资源或模型.
两者都要求,并与json回应.所以我认为我没有看到使用Google端点的好处.他们是否提供其他一些好处?我可以通过端点看到更好的分析跟踪.但是我还不需要使用post http动词来修改内容吗?
如果我使用某些框架,这会改变吗?像django.虽然我目前正在测试Ferris,它有一个处理protorpc的消息传递系统.虽然,我还没能休息.
那我错过了什么?端点有什么好处,只是让我的对象方法处理一个json请求.套接字连接是否适用于此?
我正在开发python和GAE,
当我尝试使用ProtoRPC进行Web服务时,我找不到让我的请求在消息中包含json格式数据的方法.像这样的例子:
请求格式:
{"owner_id":"some id","jsondata":[{"name":"peter","dob":"1911-1-1","aaa":"sth str","xxx":sth int}, {"name":...}, ...]}'
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
class some_function_name(messages.Message):
owner_id = messages.StringField(1, required=True)
jsondata = messages.StringField(2, required=True) #is there a json field instead of StringField?
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?
如何dict通过一个类似的对象返回protoRPC?
我试过用了 FieldList无效.我只看到以下字段定义:
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
Run Code Online (Sandbox Code Playgroud) 下一步:gae/py app的ajax前端.
我的应用程序只有基本的html版本,可以与数据存储区交互并每次更新页面.没关系,但现在需要ajax.我尝试了一些解决方案:基本的javascript,jquery的ajax API和一些框架.
我想我在knockoutjs中找到了我想要的东西,但是这个框架通过json格式与服务器交互.这意味着我需要学习json库并重写所有处理程序,以便在json中获取和发布.我可以开始这个任务,但在我想了解更多关于ProtoRPC API之前.
文档说这个API对于"创建结构化的Ajax后端"也很有用,如果我理解的话,响应中的消息是json格式的.我的问题是:
ProtoRPC API消息确实使用json?
所有请求/响应都通过ProtoRPC会出现问题吗?
实现服务器端固态ProtoRPC服务并使用框架进行客户端是一个很好的策略?