From 3f1c69a723faeca3881be911e7fe0ccdf9a76a96 Mon Sep 17 00:00:00 2001 From: naeel Date: Mon, 17 Aug 2026 17:05:20 +0400 Subject: [PATCH] =?UTF-8?q?LoadTest:=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20(Flask,=20site/?= =?UTF-8?q?app.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 4 + site/__pycache__/app.cpython-312.pyc | Bin 0 -> 3999 bytes site/app.py | 92 ++++++++++++ site/static/style.css | 128 ++++++++++++++++ site/templates/index.html | 211 +++++++++++++++++++++++++++ 5 files changed, 435 insertions(+) create mode 100644 requirements.txt create mode 100644 site/__pycache__/app.cpython-312.pyc create mode 100644 site/app.py create mode 100644 site/static/style.css create mode 100644 site/templates/index.html diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fbccab5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# Зависимости LoadTest-сервиса (платформа Nubes читает этот файл из корня репо). +Flask>=3.0 +gunicorn>=21.2 +requests>=2.31 diff --git a/site/__pycache__/app.cpython-312.pyc b/site/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c30106cf627c8e2cf0a38e9183a5e064a1c9329 GIT binary patch literal 3999 zcmbssZEO_Bb#`y>_PqD$ZwweOs181Y4?+MHmnI@5CL$@V1f;F^-TFtBMr!$I3x4sdZ)R_O$MK=6 z9dolY?`z(B^X9$BUwl3Z!62@Ycr=L6Kk3FE&f?;}#33|=FzP~>!+e74;@Fq(;^FH^ zIFdq_kaTuAlddjTQtT2r#3Mye+*rWQORkF!OHNmnQWdYag_piqya@8?!0r#wMQe$= zJWrvnTA`N8sJ&02_F!)xcgc5=x5Q$98IKP%3=Fg(q}Bs>bMfG^4-VpLTyv?`wtz!J z{16|i%X|Xjq&L!0d`QuBxm`9+l6fOXE|Uf0q)a}CBe0?X z;{yPEMy^vTnf!^&0T1lvj8lNQ30yaf5&1x-ThZjU&O}rj2!$ny{FeNTd_*pFJbJ(a zFrC>flPkdZV-R@7m@rPsAgy$aF)p{kLB^@DaXKuMPl4*XamE-W3uHdTI00yU2&&D4 zGFPZN3rqm)=7CEhzp?bSPF?`;0=WSoKpH2F37J}PflQKV@(KABxdf+u3ZkxBhJQ|- zLcPH3yuxgYnF4y)eg+Kn@!da>0h!CgJy!Lx^A7=E>Q|4;Z$;ed5gJ>=Mv;a&w^uUF@ zYx27bo;D)1seXWE#V!3xG@VPG=06LcP0jT&#h+v3)E0&)g znPHPp52!v6VNLXCmFi@=tmD;M*ld8GCc>0MOQ31c)-W@efCOa<-~ZmhLm|!-lL~|u z)*eyW4Q%XozJR&>cH)4j9Cl_tQFe>*VqPt$E#0h6J;6rYWv@!#C;SS-`Q`?$8pIJH`**Tx2RG7%tVX=lMWOKz-`9hNp}37mrt1KI@RjQl+9U052G zSxLV}Yc*S0)$}I$?8((PTitr3y*1h1isjbVI$FQm(R$ECS^sy^DIKb1`x{ECPw&rq z?fs#lK_x34))cjUPahD3oTe8x$Dr^){ZMt&17$X?E0HM1s#)J-iHRhbmO_8mW-LZcI;XRr#RXT+nw9-a#B&nHhJ*`I*bR}tniUP3ih!%1(%~aZ$LIGyZ zG95|0L#3e+3YvmWk8*3e+Dlg|&9N#CbyKt)rkRdDMK_()bWNqn*mTpir6@hzbimGZ zQ=O?#O{bd9q%iPDwf;n`Tirx?s`{1VIMxR(L8!{)^{woDlj}8IdV~oPa8!?)E@q8p z3e;Xxv`m85K~=O&Lf5K5)Jj`aEMr!UQeOrXy)%slF)O%|f1+uuX?#uYl?QIr)O^8r z-bbF>Ran)r*tqUa<0hkV)9uEsv)zm9+kV&bam$_c+l}?x$&OcVsfG3X7h9gY@c#Mt z@3d?)TDHx-bZc9orE{^Nc`AK2eWxL0G=ye1FYtwiZ!LRVURQ4KQVnwZ&;4NP=-H!& zxM4BSkXK0fEz;d`O%K%mqpp5x|JnU_t>SD{^;zULSuLlc73zL`P6K*uxjhwS6}}k`sc3c z))`^eW60a*jv4Z|7vBAH^&WEg&1F%jl^#ea*f{at*n9cyg@Ak~u*nE)Dg-v)4c09; z2mG#F=K~peYbSS(zf6SHtkp2xkw`KcOGP4Cach|U#YUlUbV7g&{b}eUg~2pDa3@x} zGku|eDMlhV-4ltZJK)OI=V5{frT@!O=|f^+%33rQ&r~`M*GR;4Kts#|R99Gw#=0LC zJElX;q$+x(hwk0UG|nWHm(=|rmexFN7N#W!$8pQNj}z{%MO@(T$n!7MQ9vEbZX|j~ zUz-`YwdzaP{+wgUi+Jbhrjt#hFOIBR=6No3-+}nx5?w7xHf~petEb2yMK(}mund_$ zmhaCs6}XMdd^@*>lC&++)zUj061=0?+m0r 0 else 0, + }, + "md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт + "meta": meta, + } + return jsonify(result) + + +if __name__ == "__main__": + # ОБЯЗАТЕЛЬНО для платформы: `python site/app.py` должен стартовать сервер. + # debug=False - прод-режим, без reloader (иначе поднимается второй процесс). + app.run(host="0.0.0.0", port=5000, debug=False) diff --git a/site/static/style.css b/site/static/style.css new file mode 100644 index 0000000..99aad2b --- /dev/null +++ b/site/static/style.css @@ -0,0 +1,128 @@ +/* LoadTest - простые стили страницы проверки загрузки файлов. */ +* { + box-sizing: border-box; +} + +body { + margin: 0; + font-family: Arial, Helvetica, sans-serif; + background: #f4f6f8; + color: #222; +} + +.wrap { + max-width: 860px; + margin: 40px auto; + padding: 0 16px; +} + +h1 { + font-size: 22px; + margin-bottom: 6px; +} + +.hint { + color: #555; + font-size: 14px; + margin-top: 0; +} + +/* Панель выбора файла */ +.panel { + background: #fff; + border: 1px solid #ddd; + border-radius: 8px; + padding: 16px; + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.panel label { + font-weight: bold; +} + +.panel input[type="file"] { + flex: 1; + min-width: 200px; +} + +.panel button { + background: #2563eb; + color: #fff; + border: none; + border-radius: 6px; + padding: 10px 20px; + font-size: 14px; + cursor: pointer; +} + +.panel button:hover { + background: #1d4ed8; +} + +/* Прогресс загрузки */ +.progress-wrap { + background: #fff; + border: 1px solid #ddd; + border-radius: 8px; + padding: 16px; + margin-top: 16px; +} + +.progress-bar { + height: 18px; + background: #e5e7eb; + border-radius: 9px; + overflow: hidden; +} + +.progress-fill { + height: 100%; + width: 0%; + background: #22c55e; + transition: width 0.2s; +} + +.progress-info { + display: flex; + gap: 16px; + margin-top: 8px; + font-size: 14px; + font-weight: bold; +} + +/* Итоговый статус */ +.status { + margin-top: 16px; + padding: 14px; + border-radius: 8px; + font-size: 16px; + font-weight: bold; +} + +.status.ok { + background: #dcfce7; + color: #166534; + border: 1px solid #86efac; +} + +.status.error { + background: #fee2e2; + color: #991b1b; + border: 1px solid #fca5a5; +} + +/* Блок статистики */ +#result { + background: #0f172a; + color: #e2e8f0; + padding: 16px; + border-radius: 8px; + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-all; + margin-top: 16px; +} diff --git a/site/templates/index.html b/site/templates/index.html new file mode 100644 index 0000000..0a5518c --- /dev/null +++ b/site/templates/index.html @@ -0,0 +1,211 @@ + + + + + + + LoadTest - проверка загрузки файлов + + + +
+

LoadTest - проверка загрузки файлов

+

+ Выберите ОДИН файл (в т.ч. большой) и нажмите «Загрузить». + Файл читается в память Flask (на диск не пишется). Результат: файл дошёл или нет + статистика. +

+ + +
+ + + +
+ + + + + +
+ + +

+  
+ + + +