LoadTest v2.0.0: версия сборки (страница, /health, ответы) + вывод версии
This commit is contained in:
+9
-3
@@ -17,6 +17,10 @@ import time
|
|||||||
|
|
||||||
from flask import Flask, jsonify, render_template, request
|
from flask import Flask, jsonify, render_template, request
|
||||||
|
|
||||||
|
# Версия сборки. ВЫВОДИТСЯ на страницу и в /health - чтобы сразу видеть,
|
||||||
|
# какая версия реально задеплоена на платформу.
|
||||||
|
VERSION = "2.0.0"
|
||||||
|
|
||||||
# Явно указываем папки шаблонов и статики -
|
# Явно указываем папки шаблонов и статики -
|
||||||
# платформа запускает `python site/app.py` из корня репо, иначе Flask не найдёт шаблоны.
|
# платформа запускает `python site/app.py` из корня репо, иначе Flask не найдёт шаблоны.
|
||||||
app = Flask(__name__, template_folder="templates", static_folder="static")
|
app = Flask(__name__, template_folder="templates", static_folder="static")
|
||||||
@@ -28,13 +32,13 @@ app = Flask(__name__, template_folder="templates", static_folder="static")
|
|||||||
@app.route("/")
|
@app.route("/")
|
||||||
def index():
|
def index():
|
||||||
"""Главная страница - форма выбора файла и загрузки."""
|
"""Главная страница - форма выбора файла и загрузки."""
|
||||||
return render_template("index.html")
|
return render_template("index.html", version=VERSION)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/health")
|
@app.route("/health")
|
||||||
def health():
|
def health():
|
||||||
"""Проверка живости для платформы."""
|
"""Проверка живости для платформы + версия сборки."""
|
||||||
return "ok"
|
return "ok v" + VERSION
|
||||||
|
|
||||||
|
|
||||||
@app.route("/upload", methods=["POST"])
|
@app.route("/upload", methods=["POST"])
|
||||||
@@ -83,6 +87,7 @@ def upload():
|
|||||||
"md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт
|
"md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт
|
||||||
"meta": meta,
|
"meta": meta,
|
||||||
}
|
}
|
||||||
|
result["version"] = VERSION # версия сборки прямо в ответе
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
|
|
||||||
@@ -131,6 +136,7 @@ def messages():
|
|||||||
"md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт
|
"md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт
|
||||||
"meta": meta,
|
"meta": meta,
|
||||||
}
|
}
|
||||||
|
result["version"] = VERSION # версия сборки прямо в ответе
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,14 @@ h1 {
|
|||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Версия сборки */
|
||||||
|
.version {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #2563eb;
|
||||||
|
font-weight: bold;
|
||||||
|
margin: 0 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.hint {
|
.hint {
|
||||||
color: #555;
|
color: #555;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<h1>LoadTest - проверка загрузки файлов</h1>
|
<h1>LoadTest - проверка загрузки файлов</h1>
|
||||||
|
<p class="version">Сборка: v{{ version }} <span id="healthInfo"></span></p>
|
||||||
<p class="hint">
|
<p class="hint">
|
||||||
Выберите ОДИН файл (в т.ч. большой) и нажмите «Загрузить».
|
Выберите ОДИН файл (в т.ч. большой) и нажмите «Загрузить».
|
||||||
Файл читается в память Flask (на диск не пишется). Результат: файл дошёл или нет + статистика.
|
Файл читается в память Flask (на диск не пишется). Результат: файл дошёл или нет + статистика.
|
||||||
@@ -215,6 +216,7 @@
|
|||||||
'HTTP статус: ' + httpStatus + '\n\n';
|
'HTTP статус: ' + httpStatus + '\n\n';
|
||||||
|
|
||||||
out += '-- СЕРВЕР (что реально дошло) --\n' +
|
out += '-- СЕРВЕР (что реально дошло) --\n' +
|
||||||
|
'Версия сборки: ' + (data.version || '?') + '\n' +
|
||||||
'Принято байт: ' + m.size_bytes + ' (' + m.size_kb + ' КБ)\n' +
|
'Принято байт: ' + m.size_bytes + ' (' + m.size_kb + ' КБ)\n' +
|
||||||
'Чтение в память: ' + s.read_ms + ' мс\n' +
|
'Чтение в память: ' + s.read_ms + ' мс\n' +
|
||||||
'Обработка всего: ' + s.total_ms + ' мс\n' +
|
'Обработка всего: ' + s.total_ms + ' мс\n' +
|
||||||
@@ -382,6 +384,7 @@
|
|||||||
|
|
||||||
out += '-- СЕРВЕР (что реально дошло) --\n' +
|
out += '-- СЕРВЕР (что реально дошло) --\n' +
|
||||||
'Имя файла: ' + f.name + '\n' +
|
'Имя файла: ' + f.name + '\n' +
|
||||||
|
'Версия сборки: ' + (data.version || '?') + '\n' +
|
||||||
'MIME: ' + f.mime + '\n' +
|
'MIME: ' + f.mime + '\n' +
|
||||||
'Принято байт: ' + f.size_bytes + ' (' + f.size_mb + ' МБ)\n' +
|
'Принято байт: ' + f.size_bytes + ' (' + f.size_mb + ' МБ)\n' +
|
||||||
'Чтение в память: ' + s.read_ms + ' мс\n' +
|
'Чтение в память: ' + s.read_ms + ' мс\n' +
|
||||||
@@ -398,6 +401,20 @@
|
|||||||
|
|
||||||
result.textContent = out;
|
result.textContent = out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---- Показать фактическую версию сборки с /health ----
|
||||||
|
function showRuntimeVersion() {
|
||||||
|
var el = document.getElementById('healthInfo');
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('GET', '/health');
|
||||||
|
xhr.timeout = 5000;
|
||||||
|
xhr.onload = function () {
|
||||||
|
if (el) el.textContent = '| /health: ' + (xhr.responseText || '');
|
||||||
|
};
|
||||||
|
xhr.onerror = function () { if (el) el.textContent = '| /health: недоступен'; };
|
||||||
|
xhr.send();
|
||||||
|
}
|
||||||
|
showRuntimeVersion();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user