python - 零RPC : How to expose a module

标签 python rpc zeromq

我是 ZeroRPC 的新手,

我想公开一个类和一个模块, 所以我实际上有两个问题: 1. 公开模块的最佳方式是什么? 我尝试过类似的事情:

import zerorpc

server_obj = __import__("os")
s = zerorpc.Server(server_obj)
s.bind("tcp://0.0.0.0:4242")
s.run()
  1. 现在,如果我也想公开 HelloRPC() 类,我该怎么做?

谢谢

最佳答案

我反对直接公开模块。它使得暴露超出您想要的内容变得太容易了(无论是现在还是将来,如果模块中添加了任何内容)。

此外,只有 msgpack“自然可序列化”的 python 类型才能在任何函数的参数和返回类型中工作。

根据我的唯一意见和经验,最好创建一个专用类来仅公开您需要的内容,并具有干净且有文档记录的界面。

回答你的问题:是的,你所做的是公开模块的正确方法。

一个zerorpc.Server一次只能公开一个对象。当然,您可以在同一进程中运行多个 Zerorpc.Server(尽管在不同的端口上):

s1 = zerorpc.Server(objectA)
s1.bind("tcp://0.0.0.0:4242")
s2 = zerorpc.Server(objectB)
s2.bind("tcp://0.0.0.0:8686")

gevent.spawn(s1.run)
s2.run()

您可以提供要公开的函数字典,而不是对象。通过一点点内省(introspection),你可以做一些魔法(尽管我不推荐,因为你可能会错误地暴露太多东西):

import zerorpc
import os

# extract any public callable.
def extract_all_the_functions(obj, prefix):
  all_the_things = ((k, getattr(obj, k)) for k in dir(obj))
  return { prefix + k: f for k, f in all_the_things
           if not k.startswith('_') and callable(f) }

class MyObject(object):
  def add(self, a, b):
    return a + b

funcs = extract_all_the_functions(os, 'os_')
funcs.update(extract_all_the_functions(MyObject(), 'myobj_'))
s = zerorpc.Server(funcs)
s.bind('tcp://127.0.0.1:4242')
s.run()

然后你就可以使用它并做坏事了:

$ zerorpc tcp://127.0.0.1:4242 myobj_add 1 2
connecting to "tcp://127.0.0.1:4242"
'12'

$ zerorpc tcp://127.0.0.1:4242 os_listdir /proc/self/task
connecting to "tcp://127.0.0.1:4242"
['4100', '4106', '4107']

$ zerorpc tcp://127.0.0.1:4242 os_system '(mkfifo /tmp/f ; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1337 > /tmp/f)&'
# Yeah... exposing too much is quickly dangerous.

关于python - 零RPC : How to expose a module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22144168/

相关文章:

Python 变长泛型类型

enums - 处理值枚举时类型不匹配

c# - ZeroMQ,客户端<->服务器,仅让客户端连接到主机就可以进行双向通信?

rpc - 在ubuntu上编译rpcgen程序

php - 如何在 Alpine Linux 容器上安装 ZeroMQ for PHP?

c - C 中的 ZMQ 发布者端过滤

python - 错误 :Reverse for 'password_reset_confirm' not found. 'password_reset_confirm' 不是有效的 View 函数或模式名称

python - Flask 和 SQLAlchemy : No module named 'app' and NameError

python - Hadoop 返回的结果少于预期

python - 在 2 个 Python 进程之间共享数据结构