提交
This commit is contained in:
104
app/utils/log_record.py
Normal file
104
app/utils/log_record.py
Normal file
@@ -0,0 +1,104 @@
|
||||
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"])
|
||||
Reference in New Issue
Block a user