Не работает utf-8 в web-терминале на python c flask
простейший web-терминал, сам по себе он работает, но любая команда(например ping), вывод которой подразумевает кирилицу, првращается в кашу из символов, в чём может быть проблемма и как это можно пофиксить?
import subprocess
import os
import signal
from flask import Response
app = Flask(__name__)
# Глобальная переменная для хранения информации о последнем процессе
last_process = {"process": None, "command": None}
@app.after_request
def apply_caching(response: Response):
response.headers["Content-Type"] = "text/html; charset=utf-8"
return response
# HTML-шаблон с мета-тегом для кодировки UTF-8
html_template = """
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Web-терминал</title>
</head>
<body>
<h1>Web-терминал</h1>
<form method="post" action="/execute">
<label for="command">Введите команду:</label>
<input type="text" id="command" name="command" required>
<button type="submit">Выполнить</button>
</form>
<h2>Результат выполнения команды:</h2>
<pre id="output">{{ output }}</pre>
<form method="post" action="/kill">
<button type="submit" style="color: red;">Остановить последнюю команду</button>
</form>
</body>
</html>
"""
# Главная страница
@app.route("/", methods=["GET"])
def index():
return render_template_string(html_template, output="")
# Выполнение команды
@app.route("/execute", methods=["POST"])
def execute_command():
global last_process
command = request.form.get("command")
if not command:
return render_template_string(html_template, output="Команда не указана!")
try:
# Запуск команды в отдельном процессе с правильной кодировкой
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, text=True)
last_process["process"] = process
last_process["command"] = command
# Чтение результата
stdout, stderr = process.communicate()
output = stdout if stdout else stderr
except Exception as e:
output = f"Ошибка: {str(e)}"
return render_template_string(html_template, output=output)
# Завершение последнего процесса
@app.route("/kill", methods=["POST"])
def kill_command():
global last_process
if last_process["process"] and last_process["process"].poll() is None: # Если процесс активен
os.kill(last_process["process"].pid, signal.SIGTERM)
last_process["process"] = None
last_process["command"] = None
return render_template_string(html_template, output="Последняя команда завершена.")
else:
return render_template_string(html_template, output="Нет активной команды для завершения.")
if __name__ == "__main__":
# Запуск приложения Flask
app.run(debug=True)
Давно не питонил, но вроде где-то у себя вот так делал
Тут сразу output должен в нужно кодировке прийти
subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True,
encoding="utf-8")
Или вот так (тут просто по получении перекодируете)
output.decode('utf-8')