#python #xml #microservices #fastapi
Вопрос:
Я новичок в Python и пытаюсь настроить небольшой пример микросервиса с помощью FastAPI.
Настройка микросервиса настраивается с помощью XML-файла конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<config>
<service name="Watch folder">
<module name="folder_watcher">
<port>8001</port>
<folder>folder/to/watch</folder>
<interval>5s</interval>
</module>
</service>
</config>
Основной модуль читается так (все еще продолжается работа):
import defusedxml.ElementTree
import subprocess
import pathlib
import os
SERVICE_DIR = 'service'
def launchService(service):
print('Service: ' service.attrib['name'])
for module in service.findall('./module'):
module_name = module.attrib['name']
print('* Module: ' module_name)
parameters = module.findall('./*')
for parameter in parameters:
print(' * ' parameter.tag ': ' parameter.text)
folder_path = pathlib.Path(__file__).parent.resolve()
command = os.path.join('python ', folder_path, SERVICE_DIR, module_name, 'main.py')
print('* Command: ' command)
subprocess.Popen(command, parameters)
def loadConfig():
# config.xml
elementTree = defusedxml.ElementTree.parse('config.xml')
for service in elementTree.findall('./service'):
launchService(service)
if __name__ == "__main__":
loadConfig()
И модуль folder_watcher main.py читает
import sys
from fastapi import FastAPI
import uvicorn
service = FastAPI()
@service.get("/")
async def root():
return {"Message": "Hello World!"}
if __name__ == "__main__":
parameters = sys.argv[1]
for parameter in parameters:
print(' * ' parameter.tag ': ' parameter.text)
uvicorn.run(service, host="localhost", port=8000)
Во время кодирования этого:
- Является
subprocess.Popen
ли правильным способом вызова микросервисов? - Как я могу предоставить фрагмент XML для конфигурации службы в качестве параметра?
- Есть ли другие вещи, которые я мог бы проследить?
Просто чтобы заранее прояснить несколько вещей: пример должен быть реализован с помощью FastAPI, я не могу использовать Docker / он должен быть реализован «автономным чистым Python», и он должен использовать XML, а не JSON или другие структурированные текстовые форматы.
Если это неправильное место для моего вопроса, пожалуйста, не стесняйтесь указывать мне правильное направление / правильную доску.
Комментарии:
1. Командная строка-не лучший способ передать что-то вроде фрагмента xml, и было бы лучше использовать файл.
2. Пример не подразумевает никакого взаимодействия с командной строкой. Я вызываю модуль из основного модуля, и мне нужно передать фрагмент XML в вызываемый модуль. Передача файла также не помогает, и повторный просмотр файла конфигурации также не является вариантом.
3. Принятые параметры
subprocess.Popen()
похожи на использование аргументов командной строки. Если используемые вами модули предназначены для программного запуска, должна быть какая-то документация о том, что они ожидают или принимают для передачи, как обычно, в справке «использование», которую вы получаете.4. Я понимаю. Могу ли я позвонить в модуль main.py и передать XML-фрагмент другим способом? Существуют ли рекомендации по передаче сложных типов данных в качестве параметров модулям?
uvicorn
Порождает ли свой собственный подпроцесс, который можетsubprocess.Popen()
устареть?5. Я не знаю, как
uvicorn
это работает. Насколько я знаю, лучшая практика передачи сложных аргументов, подобных этому, — это использование файлов, как я сказал в своем первоначальном комментарии. Вы можете использоватьtempfile
модуль для создания файлов для этой цели.