From 72a7ac4345a38e0b646c8e7774f7db8280e9ddd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Wed, 17 Jun 2026 22:18:07 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D1=8F=D1=82=D0=B8=20(=D0=BD=D0=B5=20=D0=91=D0=94),?= =?UTF-8?q?=20/logs=20endpoint,=20v1.37?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/app.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/site/app.py b/site/app.py index 28ab6ab..349a866 100644 --- a/site/app.py +++ b/site/app.py @@ -19,12 +19,14 @@ load_dotenv() import time as _time +# Логи в памяти (быстро, не тормозит ответ) +_log_memory = [] + def _log(step, detail=""): - """Писать отладочный лог в таблицу debug_log.""" - try: - db.execute("INSERT INTO debug_log (step, detail) VALUES (%s,%s)", (step, str(detail)[:500])) - except: - pass # не мешать основному потоку + """Писать лог в память (мгновенно).""" + _log_memory.append({"step": step, "detail": str(detail)[:500], "time": _time.time()}) + if len(_log_memory) > 500: + _log_memory.pop(0) def _save_file_to_db(filename, file_bytes, mime, contract_id, conn=None): @@ -80,6 +82,7 @@ class ContractsApp: self.app.add_url_rule("/chunk_json", "chunk_json", self._chunk_json, methods=["POST"]) self.app.add_url_rule("/upload", "upload_json", self._upload_json, methods=["POST"]) self.app.add_url_rule("/health", "health", self._health) + self.app.add_url_rule("/logs", "logs", self._logs) self.app.register_blueprint(test_bp) self.app.register_blueprint(upload_bp) self.app.register_blueprint(api_bp) @@ -87,6 +90,9 @@ class ContractsApp: def _health(self): return "OK", 200, {"Content-Type": "text/plain"} + def _logs(self): + return jsonify(_log_memory[-50:]) # последние 50 записей + # ── Шаг 1: загрузка файлов ────────────────────────────────── def _index(self): @@ -143,7 +149,7 @@ class ContractsApp: filename = data.get("filename", "") b64 = data.get("data", "") - _log("upload_fields", f"file={filename} b64_len={len(b64) if b64 else 0} cid={data.get('cid')}") + _log("upload", f"file={filename} b64={len(b64) if b64 else 0}") if not filename or not b64: return jsonify({"error": "Нет filename или data"}), 400 @@ -151,53 +157,42 @@ class ContractsApp: cid = data.get("cid") conn, err = db.connect() - _log("upload_connect", f"err={err}") if err: return jsonify({"error": f"БД: {err}"}), 500 try: cur = conn.cursor() if cid: contract_id = cid - _log("upload_contract", f"reuse cid={cid}") else: cur.execute( "INSERT INTO contracts (number, client) VALUES (%s, %s) RETURNING id", ("б/н " + __import__("datetime").datetime.now().strftime("%Y%m%d-%H%M"), ""), ) contract_id = cur.fetchone()[0] - _log("upload_contract", f"new cid={contract_id}") cur.execute( "INSERT INTO documents (filename, mime_type, original_b64, status) VALUES (%s,%s,%s,'uploaded')", (filename, mime, b64), ) - _log("upload_doc_insert", "ok") cur.execute("SELECT id FROM documents WHERE filename=%s AND status='uploaded' ORDER BY created_at DESC LIMIT 1", (filename,)) row = cur.fetchone() doc_id = row[0] if row else None - _log("upload_doc_select", f"doc_id={doc_id}") - if doc_id: cur.execute( "INSERT INTO supplements (contract_id, document_id, type) VALUES (%s,%s,'initial')", (str(contract_id), str(doc_id)), ) - _log("upload_suppl", "ok") conn.commit() - _log("upload_commit", "ok") cur.close() except Exception as e: - _log("upload_error", str(e)) try: conn.rollback() except: pass raise e finally: db.put_conn(conn) - _log("upload_putconn", "ok") - _log("upload_done", f"cid={contract_id} doc={doc_id}") return jsonify({"contract_id": str(contract_id), "doc_id": str(doc_id) if doc_id else None}) except Exception as e: _log("upload_outer_error", str(e))