Я уже много раз сталкивался с созданием endpoint’ов, которые принимают код на Python и выполняют его. Часто такие задачи возникали при разработке и тестировании различных сервисов; Так что у меня есть опыт по этой теме, и я готов поделиться с вами.Для создания endpoint’а, который будет принимать код на Python и тайм-аут в секундах, вам понадобится некоторое базовое знание языка Python и модуля subprocess.Прежде всего, создайте файл на вашем сервере, который будет обрабатывать запросы. С использованием Flask (или любого другого фреймворка) вы можете создать следующий код⁚
python
from flask import Flask, request
import subprocess
app Flask(__name__)
@app.route(‘/’, methods[‘POST’])
def execute_code⁚
code request.form.get(‘code’)
timeout int(request.form.get(‘timeout’))
# Запуск процесса
process subprocess.Popen([‘python’, ‘-c’, code], stdoutsubprocess.PIPE, stderrsubprocess.PIPE)
try⁚
# Получение вывода из процесса и ожидание окончания выполнения
stdout, stderr process.communicate(timeouttimeout)
# Проверка, завершился ли процесс по тайм-ауту
if process.poll is None⁚
process.kill
return ‘Исполнение кода не уложилось в заданное время’
# Отправка результата выполнения кода
return stdout.decode
except subprocess.TimeoutExpired⁚
process.kill
return ‘Исполнение кода не уложилось в заданное время’
if __name__ ‘__main__’⁚
app.run
Давайте разберем этот код шаг за шагом⁚
1. Мы импортируем класс Flask для создания веб-приложения и модуль subprocess для запуска процесса выполнения кода.
2. Мы создаем экземпляр класса Flask и определяем маршрут ‘/’ с методом POST, который будет принимать запросы на выполение кода.
3. Внутри функции execute_code мы получаем код и тайм-аут из запроса.
4. Мы используем subprocess.Popen для запуска процесса выполнения кода. Мы передаем список аргументов в Popen٫ включая команду ‘python -c’ и сам код٫ а также перенаправляем вывод в переменные stdout и stderr.
5. Мы устанавливаем тайм-аут выполнения процесса с помощью метода communicate и передаем время ожидания в секундах.
6. Если процесс выполнился за отведенное время, мы возвращаем вывод выполнения кода.
7. Если процесс еще не завершился٫ когда время ожидания истекло٫ мы его прерываем путем вызова метода kill и возвращаем сообщение о превышении времени выполнения кода.
Теперь давайте поговорим о параметре shellTrue, который вы упомянули в вопросе. Использование этого параметра может быть опасным, поскольку он позволяет выполнить любую команду операционной системы с помощью subprocess. Это может представлять угрозу безопасности, поскольку злоумышленники могут внедрить вредоносный код в вашу систему.
Поэтому рекомендуется не использовать shellTrue, а вместо этого передавать команду и аргументы в виде списка, как показано в примере выше. Это считается более безопасным способом выполнения кода.