Я пишу приложение, которое может предоставить простой интерфейс RPC, реализованный с помощью flask. Однако я хочу, чтобы можно было активировать и деактивировать этот интерфейс. Также должна быть возможность запуска нескольких экземпляров приложения в одном и том же интерпретаторе Python, каждый из которых имеет собственный интерфейс RPC.
Служба доступна только для локального хоста, и это прототип, поэтому я не беспокоюсь о безопасности. Я ищу небольшое и простое решение. Очевидным способом здесь, кажется, является использование сервера разработки фляг, однако я не могу найти способ его отключить.
Я создал план фляги для функций, которые я хочу раскрыть, и теперь я пытаюсь написать класс для оболочки интерфейса RPC, подобный этому:
class RPCInterface:
def __init__(self, creating_app, config):
self.flask_app = Flask(__name__)
self.flask_app.config.update(config)
self.flask_app.my_app = creating_app
self.flask_app.register_blueprint(my_blueprint)
self.flask_thread = Thread(target=Flask.run, args=(self.flask_app,),
name='flask_thread', daemon=True)
def shutdown(self):
# Seems impossible with the flask server
raise NotImplemented()
Я использую переменную my_app текущего приложения, чтобы передать экземпляр моего приложения, с которым работает этот интерфейс RPC, в контекст запросов.
Его можно отключить изнутри запроса (как описано здесь http://flask.pocoo.org/snippets/67/), поэтому одним из решений может быть создание конечной точки выключения и отправка запроса тестовому клиенту, чтобы инициировать выключение. Однако для этого требуется конечная точка фляги. Это далеко не чисто.
Я просмотрел исходный код flask и werkzeug и выяснил важную часть (контекст в https://github.com/pallets/werkzeug/blob/master/werkzeug/serving.py#L688) выглядит так:
def inner():
try:
fd = int(os.environ['WERKZEUG_SERVER_FD'])
except (LookupError, ValueError):
fd = None
srv = make_server(hostname, port, application, threaded,
processes, request_handler,
passthrough_errors, ssl_context,
fd=fd)
if fd is None:
log_startup(srv.socket)
srv.serve_forever()
make_server
возвращает экземпляр класса сервера werkzeugs, который наследуется от класса http.server
python. Это, в свою очередь, python BaseSocketServer
, который предоставляет метод завершения работы. Проблема в том, что созданный здесь сервер — это всего лишь локальная переменная, и поэтому он недоступен ниоткуда.
Тут я зашел в тупик. Итак, мой вопрос:
- У кого-нибудь есть другая идея, как легко отключить этот сервер?
- Есть ли другой простой сервер для запуска фляги? Что-то, что не требует внешнего процесса и может быть просто запущено и остановлено несколькими строками кода? Все, что перечислено в документе фляги, похоже, имеет сложную настройку.