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.

116 lines
4.1KB

  1. from functools import wraps
  2. import time
  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. log_content=f"请求: {request.method} {request.url} "
  30. # 如果是POST请求,记录请求体数据
  31. if request.method == 'POST':
  32. try:
  33. # 获取JSON格式的请求体数据
  34. post_data = request.get_json(silent=True)
  35. if post_data:
  36. log_content=log_content+f"POST JSON数据: {post_data}"
  37. else:
  38. # 如果JSON数据为空,尝试获取表单数据
  39. form_data = request.form
  40. if form_data:
  41. #logger.info(f"POST 表单数据: {form_data}")
  42. log_content=log_content+f"POST JSON数据: {post_data}"
  43. except Exception as e:
  44. logger.error(f"记录POST数据时发生错误: {e}")
  45. logger.info(log_content)
  46. g.start_time = time.time()
  47. def after_request(response):
  48. elapsed_time = time.time() - g.start_time
  49. log_content=f"响应: 用了 {elapsed_time:.4f} 秒"
  50. # return response
  51. if response.status_code >= 400:
  52. # 失败响应
  53. error_message = response.get_json(silent=True)['message']
  54. json_response = make_response(jsonify(fail_response(response.status_code, error_message)), response.status_code)
  55. log_content=log_content+f"失败响应: {json_response.get_json(silent=True)}"
  56. else:
  57. # 成功响应
  58. data = response.get_json(silent=True)
  59. json_response = make_response(jsonify(success_response(data)), response.status_code)
  60. log_content=log_content+f"成功响应: {json_response.get_json(silent=True)}"
  61. json_response.headers['X-Processed-Time'] = g.get('start_time', 'unknown')
  62. logger.info(f'{log_content}')
  63. return json_response
  64. def handle_exception(error):
  65. logger.error(f'发生异常: {error}')
  66. # response = jsonify({'error': str(error)})
  67. response = jsonify({'message': str(error)})
  68. response.status_code = 500
  69. return response
  70. def auth_required_time(f):
  71. @wraps(f)
  72. def decorated_function(*args, **kwargs):
  73. req = request.get_json()
  74. wxid = req.get("wxid")
  75. if not wxid:
  76. response=jsonify({'code': 400, 'message': '缺少wxid参数'})
  77. response.status_code = 400
  78. return response
  79. k, login_info = utils.get_login_info_by_wxid(wxid)
  80. if not login_info or login_info.get('status') == "0":
  81. response=jsonify({'code': 401, 'message': '用户没有登录'})
  82. response.status_code = 401
  83. return response
  84. # 获取登录信息的创建时间
  85. creation_timestamp=int(login_info.get('create_at',time.time()))
  86. current_timestamp = time.time()
  87. three_days_seconds = 3 * 24 * 60 * 60 # 三天的秒数
  88. diff_flag=(current_timestamp - creation_timestamp) >= three_days_seconds
  89. print(f"creation_timestamp:{creation_timestamp},current_timestamp:{current_timestamp},diff_flag:{diff_flag}")
  90. if not diff_flag:
  91. response=jsonify({'code': 401, 'message': '用户创建不够三天,不能使用该功能'})
  92. response.status_code = 401
  93. return response
  94. # # # 将认证信息注入请求环境变量
  95. request.environ['token_id'] = login_info.get('tokenId')
  96. request.environ['app_id'] = login_info.get('appId')
  97. return f(*args, **kwargs)
  98. return decorated_function