Как создать что-то вроде REST API без HTTP? - PullRequest
0 голосов
/ 29 марта 2019

Прежде всего, извините за плохой заголовок.

Я бы хотел, чтобы 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 Ответ

1 голос
/ 29 марта 2019

Вот пример с использованием сокетов.

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 в другой.

...