v1.0.99: fix all Flask-proxy in background thread — user_email + app_version as params

This commit is contained in:
2026-07-28 10:49:21 +04:00
parent 3dbddda858
commit 5a20962015
2 changed files with 22 additions and 4 deletions
+16
View File
@@ -46,6 +46,22 @@
- Максимум 500 записей, удаление старше 1 часа - Максимум 500 записей, удаление старше 1 часа
- `_ts` timestamp в каждой записи - `_ts` timestamp в каждой записи
## v1.0.99 (28.07.2026) — фикс: Flask-прокси в фоновом потоке
### Найденные ошибки
1. `get_token_info()``request.cookies` → в потоке нет request-контекста → RuntimeError
2. `current_app.config.get("VERSION")` → Flask-proxy → та же проблема
3. `except: pass` глушил ошибки → записи молча не сохранялись
### Исправление
- `user_email` и `app_version` получаются в `api_test()` (где есть request)
и передаются параметрами в `_finish_op``save_run`
- Добавлено логирование ошибок в `save_run` (больше не глухое `pass`)
### Урок
`py_compile` проверяет только синтаксис. Flask-прокси (`request`, `current_app`, `g`, `session`)
**не работают** в фоновых потоках. Все нужные значения — до `threading.Thread` параметрами.
## v1.0.89 (27.07.2026) — Sonnet Rounds 1-3 + документирование ## v1.0.89 (27.07.2026) — Sonnet Rounds 1-3 + документирование
### 1. PostgreSQL connection string ### 1. PostgreSQL connection string
+6 -4
View File
@@ -235,7 +235,8 @@ def api_test():
# фоном ждать завершения # фоном ждать завершения
user_email = get_token_info().get("email", "") user_email = get_token_info().get("email", "")
threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, True, get_client_id(), get_stand(), params, user_email), daemon=True).start() app_version = current_app.config.get("VERSION", "")
threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, True, get_client_id(), get_stand(), params, user_email, app_version), daemon=True).start()
return jsonify({"status": "RUNNING", "opUid": op_uid, "instanceUid": instance_uid, "displayName": display_name}) return jsonify({"status": "RUNNING", "opUid": op_uid, "instanceUid": instance_uid, "displayName": display_name})
else: else:
@@ -265,7 +266,8 @@ def api_test():
if not display_name: if not display_name:
display_name = _get_instance_display_name(client, instance_uid) display_name = _get_instance_display_name(client, instance_uid)
user_email = get_token_info().get("email", "") user_email = get_token_info().get("email", "")
threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, False, get_client_id(), get_stand(), is_delete, params, user_email), daemon=True).start() app_version = current_app.config.get("VERSION", "")
threading.Thread(target=_finish_op, args=(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, False, get_client_id(), get_stand(), is_delete, params, user_email, app_version), daemon=True).start()
return jsonify({"status": "RUNNING", "opUid": op_uid, "instanceUid": instance_uid, "displayName": display_name}) return jsonify({"status": "RUNNING", "opUid": op_uid, "instanceUid": instance_uid, "displayName": display_name})
except Exception as e: except Exception as e:
@@ -304,7 +306,7 @@ def _get_instance_display_name(client, instance_uid):
return instance_uid return instance_uid
def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, is_create, client_id, stand, is_delete=False, params=None, user_email=""): def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_op_id, is_create, client_id, stand, is_delete=False, params=None, user_email="", app_version=""):
"""Фоном ждать dtFinish и сохранить результат.""" """Фоном ждать dtFinish и сохранить результат."""
import time import time
_cleanup_op_results() # очистить старые записи перед добавлением новой _cleanup_op_results() # очистить старые записи перед добавлением новой
@@ -354,7 +356,7 @@ def _finish_op(client, op_uid, instance_uid, svc_id, display_name, op_name, svc_
str(err) if err else "", str(err) if err else "",
params or {}, params or {},
op.get("stages", []), op.get("stages", []),
current_app.config.get("VERSION", "")) app_version)
except Exception as e: except Exception as e:
import traceback import traceback
print(f"[DB] save_run FAILED: {e}", flush=True) print(f"[DB] save_run FAILED: {e}", flush=True)