You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 satır
4.9KB

  1. from functools import wraps
  2. import time,uuid
  3. from flask import request, g, jsonify, make_response,current_app
  4. from common.log import logger
  5. from datetime import datetime
  6. from common import utils,redis_helper
  7. # 定义生成失败响应的函数
  8. def fail_response(code, error_message):
  9. return {
  10. "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
  11. "result": {
  12. "status": "failed",
  13. "code": code,
  14. "message": error_message
  15. }
  16. }
  17. # 定义生成成功响应的函数
  18. def success_response(data):
  19. return {
  20. "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
  21. "data": data,
  22. "result": {
  23. "status": "succeed",
  24. "code": 200,
  25. "message": "请求成功!"
  26. }
  27. }
  28. def before_request():
  29. # 生成唯一的请求 ID
  30. request_id = str(uuid.uuid4())
  31. g.request_id = request_id
  32. log_content=f"{request_id} 请求: {request.method} {request.url} "
  33. # 如果是POST请求,记录请求体数据
  34. if request.method == 'POST':
  35. try:
  36. # 获取JSON格式的请求体数据
  37. post_data = request.get_json(silent=True)
  38. if post_data:
  39. log_content=log_content+f"POST JSON数据: {post_data}"
  40. else:
  41. # 如果JSON数据为空,尝试获取表单数据
  42. form_data = request.form
  43. if form_data:
  44. #logger.info(f"POST 表单数据: {form_data}")
  45. log_content=log_content+f"POST JSON数据: {post_data}"
  46. except Exception as e:
  47. logger.error(f"记录POST数据时发生错误: {e}")
  48. logger.info(log_content)
  49. g.start_time = time.time()
  50. def after_request(response):
  51. elapsed_time = time.time() - g.start_time
  52. request_id = g.get('request_id', 'unknown')
  53. log_content=f"{request_id} 响应: 用了 {elapsed_time:.4f} 秒"
  54. # return response
  55. if response.status_code >= 400:
  56. # 失败响应
  57. error_message = response.get_json(silent=True)['message']
  58. json_response = make_response(jsonify(fail_response(response.status_code, error_message)), response.status_code)
  59. log_content=log_content+f"失败响应: {json_response.get_json(silent=True)}"
  60. else:
  61. # 成功响应
  62. data = response.get_json(silent=True)
  63. json_response = make_response(jsonify(success_response(data)), response.status_code)
  64. log_content=log_content+f"成功响应: {json_response.get_json(silent=True)}"
  65. json_response.headers['X-Processed-Time'] = g.get('start_time', 'unknown')
  66. logger.info(f'{log_content}')
  67. return json_response
  68. def handle_exception(error):
  69. logger.error(f'发生异常: {error}')
  70. # response = jsonify({'error': str(error)})
  71. response = jsonify({'message': str(error)})
  72. response.status_code = 500
  73. return response
  74. def check_login_status(func):
  75. @wraps(func)
  76. def wrapper(*args, **kwargs):
  77. wxid = kwargs.get('wxid') # 从关键字参数中获取 wxid
  78. if not wxid:
  79. if len(args) > 0:
  80. wxid = args[0]
  81. else:
  82. raise ValueError("wxid is required")
  83. k, login_info = utils.get_login_info_by_wxid(wxid)
  84. if login_info.get('status') == "0":
  85. return # 如果 status 为 "0",直接返回,不执行原函数
  86. return func(*args, **kwargs)
  87. return wrapper
  88. def auth_required_time(f):
  89. @wraps(f)
  90. def decorated_function(*args, **kwargs):
  91. req = request.get_json()
  92. wxid = req.get("wxid")
  93. if not wxid:
  94. response=jsonify({'code': 400, 'message': '缺少wxid参数'})
  95. response.status_code = 400
  96. return response
  97. k, login_info = utils.get_login_info_by_wxid(wxid)
  98. if not login_info or login_info.get('status') == "0":
  99. response=jsonify({'code': 401, 'message': '用户没有登录'})
  100. response.status_code = 401
  101. return response
  102. # 获取登录信息的创建时间
  103. creation_timestamp=int(login_info.get('create_at',time.time()))
  104. current_timestamp = time.time()
  105. three_days_seconds = 3 * 24 * 60 * 60 # 三天的秒数
  106. diff_flag=(current_timestamp - creation_timestamp) >= three_days_seconds
  107. print(f"creation_timestamp:{creation_timestamp},current_timestamp:{current_timestamp},diff_flag:{diff_flag}")
  108. if not diff_flag:
  109. response=jsonify({'code': 401, 'message': '用户创建不够三天,不能使用该功能'})
  110. response.status_code = 401
  111. return response
  112. # # # 将认证信息注入请求环境变量
  113. request.environ['token_id'] = login_info.get('tokenId')
  114. request.environ['app_id'] = login_info.get('appId')
  115. return f(*args, **kwargs)
  116. return decorated_function