如何在不使用HTTP的情况下创建类似REST API的“东西”?

时间:2019-03-29 19:40:15

标签: python linux python-3.x service architecture

首先,对不起您的头衔。

我想让my_api_service.py作为后台服务运行,该服务与 REST-API 类似,其他脚本,但没有HTTP

不同的Python实例上运行的不同的虚拟环境上的脚本应该能够通过my_api_service.py使用my_api_connector.py

我希望我的问题是不是基于观点的,因为我正在寻找一种常见/最佳实践/模式。

以下是伪代码。

my_api_service.py -Python实例1

# Singleton
instance = None
def instance():
    if not instance:
        self.instance = MyGlobalService()
    return instance

# Title setter
def set_title(title):
    self.instance.set_title(title)

# Title getter
def get_title(title):
    return self.instance.get_title()

print_current_title.py -Python实例2

from my_api_connector import get_instance

while True:
    # The title should change when set_title.py was executed
    title = get_instance().get_title()
    print('Current title: {0}'.format(title))

set_title.py -Python实例3

from my_api_connector import get_instance
get_instance().get_title('New title')

有什么主意吗?预先感谢!

1 个答案:

答案 0 :(得分:1)

这是一个使用套接字的示例。

client.py:

import my_api_connector

print(my_api_connector.get_title())  # will print title
my_api_connector.set_title('another_title')
print(my_api_connector.get_title())  # will print another_title

my_api_connector.py:

import socket

IP = '127.0.0.1'
PORT = 12345
SOCK = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

def get_title():
    SOCK.sendto(b'get_title', (IP, PORT))
    data, _ = SOCK.recvfrom(1024)
    return str(data, 'utf-8')

def set_title(title):
    SOCK.sendto(bytes('set_title {}'.format(title), encoding='utf-8'), (IP, PORT))

server.py:

import socket

IP = '127.0.0.1'
PORT = 12345
SOCK = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
SOCK.bind((IP, PORT))

def main():
    title = 'title'
    while True:
        data, addr = SOCK.recvfrom(1024)
        data = str(data, 'utf-8')
        if data == 'get_title':
            SOCK.sendto(bytes(title, encoding='utf-8'), addr)
        elif data.startswith('set_title'):
            title = data[len('set_title '):]

if __name__ == '__main__':
    main()

只需在一个控制台中启动server.py,然后在另一个控制台中启动client.py。