我正在尝试理解如何使用Python进行RPC调用。我有一个愚蠢的服务器,它定义了一个类,并公开了一个创建该类实例的方法:
# server.py
class Greeter(object):
def __init__(self, name):
self.name = name
def greet(self):
return "Hi {}!".format(self.name)
def greeter_factory(name):
return Greeter(name)
some_RPC_framework.register(greeter_factory)和一个想要获取Greeter实例的客户端
# client.py
greeter_factory = some_RPC_framework.proxy(uri_given_by_server)
h = greeter_factory("Heisemberg")
print("Server returned:", h.greet())问题是我发现没有框架允许返回用户定义对象的实例,或者只返回带有对象属性的字典(例如,Pyro4)。
在过去,我使用过Java RMI,您可以在服务器上指定一个代码库,如果需要,客户端可以在该代码库中下载编译的类。Python也有类似的东西吗?也许是一些框架,可以将对象与类字节码一起序列化,让客户端拥有一个完整的类实例?
发布于 2015-01-14 08:02:18
Pyro可以在一定程度上做到这一点。在使用默认序列化程序时,可以注册自定义类(反)序列化程序。或者,您可以决定使用pickle序列化程序,但这会带来严重的安全隐患。请参阅http://pythonhosted.org/Pyro4/clientcode.html#serialization
Pyro不会为您做的是传递组成模块定义的实际字节码,即使在使用pickle序列化程序时也是如此。在您的示例中,客户端必须能够以常规方式导入定义类的模块。没有密码传输。
发布于 2015-02-11 19:33:17
您可以考虑使用
payload = CPickle.dump(Greeter(name))在服务器端和客户端,一旦接收到有效负载,就执行以下操作:
h = CPickle.load(payload)以获取服务器已创建的Greeter对象的实例。
https://stackoverflow.com/questions/27932550
复制相似问题