2025-10-14 16:04:37 +03:00 | | | '''
|
| | | File: main.py
|
| | | Description: Веб-приложение для веб-сервера терминалов, основной файл FastAPI
|
| | | '''
|
| | |
|
2026-10-28 21:13:30 +03:00 | | | __version__ = '0.3.0'
|
2025-10-14 16:04:37 +03:00 | | |
|
| | |
|
2025-10-04 15:10:53 +03:00 | | | # Импортируем нужные классы из библиотек
|
2025-10-21 16:08:01 +03:00 | | | from contextlib import asynccontextmanager
|
2025-10-14 23:54:26 +03:00 | | | from fastapi import FastAPI, Request, Path
|
2025-10-10 10:16:59 +03:00 | | | from fastapi.staticfiles import StaticFiles
|
2025-10-07 21:48:20 +03:00 | | | from fastapi.responses import HTMLResponse, JSONResponse
|
2025-10-21 16:08:01 +03:00 | | | from fastapi.templating import Jinja2Templates
|
| | | from pydantic_settings import BaseSettings, JsonConfigSettingsSource, SettingsConfigDict
|
| | |
|
2025-11-11 12:15:50 +03:00 | | | from config import Config
|
2025-10-21 16:08:01 +03:00 | | | from mt5_control import MT5_Control
|
| | |
|
| | |
|
| | | @asynccontextmanager
|
| | | async def lifespan(app: FastAPI):
|
2025-11-20 14:02:48 +03:00 | | | # Создаем объект, читающий конфигурацию из JSON-файла
|
2025-10-21 16:08:01 +03:00 | | | config = Config(_env_file=None)
|
2025-11-20 14:02:48 +03:00 | | |
|
| | | # Переносим прочитанное в объект app
|
2025-10-30 09:59:38 +03:00 | | | app.state.terminals = config.terminals
|
2025-10-21 16:08:01 +03:00 | | | app.state.instances = {}
|
2025-10-30 09:59:38 +03:00 | | |
|
2025-11-20 14:02:48 +03:00 | | | # Обеспечиваем наличие имени экземпляра терминала.
|
| | | # При отсутсвии его в конфигурации подставляется имя папки
|
2025-10-30 09:59:38 +03:00 | | | for folder in app.state.terminals:
|
2025-11-11 12:15:50 +03:00 | | | app.state.terminals[folder]['name'] = app.state.terminals[folder].get(
|
| | | 'name', folder)
|
2025-10-30 09:59:38 +03:00 | | |
|
2025-11-20 14:02:48 +03:00 | | | # Создаём глобальный объект управления терминалами
|
2025-10-21 16:08:01 +03:00 | | | global control
|
2025-11-11 12:15:50 +03:00 | | | control = MT5_Control(app.state.terminals,
|
2026-07-25 20:52:51 +03:00 | | | config.mt5_folder, config.database, config.mt5_exe)
|
2025-10-21 16:08:01 +03:00 | | | yield
|
2025-10-04 15:10:53 +03:00 | | |
|
| | | # Создаём объект приложения
|
2025-10-21 16:08:01 +03:00 | | | app = FastAPI(lifespan=lifespan)
|
2025-10-04 15:10:53 +03:00 | | |
|
2025-10-14 14:59:40 +03:00 | | | # Подключаем статические файлы
|
2025-10-14 16:04:37 +03:00 | | | app.mount('/static', StaticFiles(directory='static'), name='static')
|
2025-10-14 14:59:40 +03:00 | | |
|
| | | # Создаём объект для работы с шаблонами HTML-кода
|
2025-10-14 16:04:37 +03:00 | | | templates = Jinja2Templates(directory='templates')
|
2025-10-10 10:16:59 +03:00 | | |
|
| | |
|
2025-10-06 23:34:05 +03:00 | | | @app.get('/', response_class=HTMLResponse)
|
2025-10-10 10:16:59 +03:00 | | | async def index(request: Request):
|
2025-10-14 16:04:37 +03:00 | | | '''Обработчик GET / (корневой каталог) - панель управления терминалами'''
|
2025-10-21 16:08:01 +03:00 | | | instances = control.load_instances()
|
2026-07-27 13:17:22 +03:00 | | | return templates.TemplateResponse(request, 'index.html', {'instances': instances})
|
2025-10-07 21:48:20 +03:00 | | |
|
2025-10-14 14:59:40 +03:00 | | |
|
2025-10-21 16:08:01 +03:00 | | | @app.post('/instances/{name}')
|
2026-07-27 13:17:22 +03:00 | | | async def info_instance(name: str = Path(..., description="Информация об экземпляре", examples=["MetaTrader5.1"])):
|
2025-11-17 21:13:30 +03:00 | | | '''Получение информации об экземпляре терминала'''
|
2025-10-21 16:08:01 +03:00 | | | result = control.instance_info(name)
|
| | | return JSONResponse(result)
|
| | |
|
| | |
|
2025-10-14 14:12:34 +03:00 | | | @app.post('/start/{name}')
|
2026-07-27 13:17:22 +03:00 | | | async def start_instance(name: str = Path(..., description="Название экземпляра", examples=["MetaTrader5.1"])):
|
2025-10-14 23:54:26 +03:00 | | | '''Запуск экземпляра терминала'''
|
2025-10-21 16:08:01 +03:00 | | | result = control.start_mt5(name)
|
2025-10-07 21:48:20 +03:00 | | | return JSONResponse(result)
|
| | |
|
2025-10-14 14:59:40 +03:00 | | |
|
2025-10-14 14:12:34 +03:00 | | | @app.post('/stop/{name}')
|
2026-07-27 13:17:22 +03:00 | | | async def stop_instance(name: str = Path(..., description="Название экземпляра", examples=["MetaTrader5.1"])):
|
2025-10-14 23:54:26 +03:00 | | | '''Остановка экземпляра терминала'''
|
2025-10-21 16:08:01 +03:00 | | | result = control.stop_mt5(name)
|
2025-10-07 21:48:20 +03:00 | | | return JSONResponse(result)
|
2025-10-16 20:41:52 +03:00 | | |
|
| | |
|
| | | @app.post('/create/{name}')
|
2026-07-27 13:17:22 +03:00 | | | async def create_instance(name: str = Path(..., description="Название экземпляра", examples=["MetaTrader5.1"])):
|
2025-10-21 16:08:01 +03:00 | | | '''Создание экземпляра терминала'''
|
| | | result = control.create_mt5(name)
|
| | | return JSONResponse(result)
|