v1.0.99: fix all Flask-proxy in background thread — user_email + app_version as params
This commit is contained in:
@@ -46,6 +46,22 @@
|
||||
- Максимум 500 записей, удаление старше 1 часа
|
||||
- `_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 + документирование
|
||||
|
||||
### 1. PostgreSQL connection string
|
||||
|
||||
@@ -235,7 +235,8 @@ def api_test():
|
||||
|
||||
# фоном ждать завершения
|
||||
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})
|
||||
|
||||
else:
|
||||
@@ -265,7 +266,8 @@ def api_test():
|
||||
if not display_name:
|
||||
display_name = _get_instance_display_name(client, instance_uid)
|
||||
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})
|
||||
|
||||
except Exception as e:
|
||||
@@ -304,7 +306,7 @@ def _get_instance_display_name(client, 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 и сохранить результат."""
|
||||
import time
|
||||
_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 "",
|
||||
params or {},
|
||||
op.get("stages", []),
|
||||
current_app.config.get("VERSION", ""))
|
||||
app_version)
|
||||
except Exception as e:
|
||||
import traceback
|
||||
print(f"[DB] save_run FAILED: {e}", flush=True)
|
||||
|
||||
Reference in New Issue
Block a user