log.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: log.py
  6. @date:2025/6/4 14:13
  7. @desc:
  8. """
  9. from system_manage.models.log_management import Log
  10. def _get_ip_address(request):
  11. """
  12. 获取ip地址
  13. @param request:
  14. @return:
  15. """
  16. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
  17. if x_forwarded_for:
  18. ip = x_forwarded_for.split(',')[0]
  19. else:
  20. ip = request.META.get('REMOTE_ADDR')
  21. return ip
  22. def _get_user(request):
  23. """
  24. 获取用户
  25. @param request:
  26. @return:
  27. """
  28. user = request.user
  29. if user is None:
  30. return {
  31. }
  32. user_info = {
  33. "id": str(user.id),
  34. "email": user.email,
  35. "phone": user.phone,
  36. "nick_name": user.nick_name,
  37. "username": user.username,
  38. }
  39. # 如果是 User 模型且有 role 属性
  40. if hasattr(user, 'role'):
  41. user_info['role'] = user.role
  42. return user_info
  43. def _get_details(request):
  44. path = request.path
  45. body = request.data
  46. query = request.query_params
  47. return {
  48. 'path': path,
  49. 'body': body,
  50. 'query': query
  51. }
  52. def _get_workspace_id(request, kwargs):
  53. return kwargs.get('workspace_id', 'None')
  54. def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details,
  55. get_operation_object=None, get_workspace_id=_get_workspace_id):
  56. """
  57. 记录审计日志
  58. @param menu: 操作菜单 str
  59. @param operate: 操作 str|func 如果是一个函数 入参将是一个request 响应为str def operate(request): return "操作菜单"
  60. @param get_user: 获取用户
  61. @param get_ip_address:获取IP地址
  62. @param get_details: 获取执行详情
  63. @param get_operation_object: 获取操作对象
  64. @param get_workspace_id: 获取工作空间id
  65. @return:
  66. """
  67. def inner(func):
  68. def run(view, request, **kwargs):
  69. status = 200
  70. operation_object = {}
  71. try:
  72. if get_operation_object is not None:
  73. operation_object = get_operation_object(request, kwargs)
  74. except Exception as e:
  75. pass
  76. try:
  77. return func(view, request, **kwargs)
  78. except Exception as e:
  79. status = 500
  80. raise e
  81. finally:
  82. ip = get_ip_address(request)
  83. user = get_user(request)
  84. details = get_details(request)
  85. workspace_id = get_workspace_id(request, kwargs)
  86. _operate = operate
  87. if callable(operate):
  88. _operate = operate(request)
  89. # 插入审计日志
  90. Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details,
  91. operation_object=operation_object, workspace_id=workspace_id).save()
  92. return run
  93. return inner