from functools import wraps from flask import request, g import json from flask_jwt_extended import current_user from app.models import OperationHistory, User from app import db,jwt def log_operation(func): @wraps(func) def decorated(*args, **kwargs): log_entry = OperationHistory( api_path=request.path, http_method=request.method, ip_address=request.remote_addr, request_params=None # 用户信息暂留空 ) # 记录GET参数 if request.method == "GET": log_entry.request_params = request.args.to_dict() # 记录POST参数(支持JSON/表单/原始数据) elif request.method == "POST": if request.is_json: res=request.get_json(silent=True) or None json_str = json.dumps(res,ensure_ascii=False) log_entry.request_params = json_str elif request.form: json_str = json.dumps(request.form.to_dict(),ensure_ascii=False) log_entry.request_params =json_str elif request.data: json_str = json.dumps({"raw_data": request.data.decode('utf-8')[:500]},ensure_ascii=False) # 原始数据截取前500字符 log_entry.request_params =json_str try: response = func(*args, **kwargs) # 执行原函数(触发 JWT 验证) log_entry.user_id = current_user.id # 此时 current_user 已就绪 log_entry.username = current_user.username log_entry.response_code = response.status_code return response except Exception as e: log_entry.error_message = str(e) log_entry.operation_result = 0 raise finally: db.session.add(log_entry) db.session.commit() return decorated # def log_operation(func): # @wraps(func) # def decorated(*args, **kwargs): # # 初始化日志对象(示例结构) # log_entry = { # "path": request.path, # "method": request.method, # "ip": request.remote_addr, # "params": None # 待填充 # } # try: # # ---- 核心:记录请求参数 ---- # if request.method == "GET": # params = request.args.to_dict() # log_entry["params"] = filter_sensitive_data(params) # elif request.method == "POST": # if request.is_json: # json_data = request.get_json(silent=True) or {} # log_entry["params"] = filter_sensitive_data(json_data) # elif request.form: # form_data = request.form.to_dict() # log_entry["params"] = filter_sensitive_data(form_data) # elif request.files: # log_entry["files"] = [f.filename for f in request.files.values()] # # ---- 执行原函数 ---- # start_time = time() # response = func(*args, **kwargs) # duration = time() - start_time # # ---- 记录响应 ---- # log_entry["status"] = response.status_code # log_entry["duration"] = f"{duration:.3f}s" # return response # except Exception as e: # log_entry["error"] = str(e) # raise # finally: # # 实际存储到数据库/文件(此处打印示例) # current_app.logger.info(json.dumps(log_entry, ensure_ascii=False)) # return decorated # JWT 用户回调 @jwt.user_lookup_loader def load_user(jwt_header, jwt_data): return User.query.get(jwt_data["sub"])