Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

92 lines
3.2KB

  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. logger.info(f"请求: {request.method} {request.url} ")
  30. g.start_time = time.time()
  31. def after_request(response):
  32. elapsed_time = time.time() - g.start_time
  33. logger.info(f'响应: 用了 {elapsed_time:.4f} 秒')
  34. # return response
  35. if response.status_code >= 400:
  36. # 失败响应
  37. error_message = response.get_json(silent=True)['message']
  38. json_response = make_response(jsonify(fail_response(response.status_code, error_message)), response.status_code)
  39. else:
  40. # 成功响应
  41. data = response.get_json(silent=True)
  42. json_response = make_response(jsonify(success_response(data)), response.status_code)
  43. json_response.headers['X-Processed-Time'] = g.get('start_time', 'unknown')
  44. return json_response
  45. def handle_exception(error):
  46. logger.error(f'发生异常: {error}')
  47. # response = jsonify({'error': str(error)})
  48. response = jsonify({'message': str(error)})
  49. response.status_code = 500
  50. return response
  51. def auth_required_time(f):
  52. @wraps(f)
  53. def decorated_function(*args, **kwargs):
  54. req = request.get_json()
  55. wxid = req.get("wxid")
  56. if not wxid:
  57. response=jsonify({'code': 400, 'message': '缺少wxid参数'})
  58. response.status_code = 400
  59. return response
  60. k, login_info = utils.get_login_info_by_wxid(wxid)
  61. if not login_info or login_info.get('status') == "0":
  62. response=jsonify({'code': 401, 'message': '用户没有登录'})
  63. response.status_code = 401
  64. return response
  65. # 获取登录信息的创建时间
  66. creation_timestamp=int(login_info.get('create_at'))
  67. current_timestamp = time.time()
  68. three_days_seconds = 3 * 24 * 60 * 60 # 三天的秒数
  69. diff_flag=(current_timestamp - creation_timestamp) >= three_days_seconds
  70. print(f"creation_timestamp:{creation_timestamp},current_timestamp:{current_timestamp},diff_flag:{diff_flag}")
  71. if not diff_flag:
  72. response=jsonify({'code': 401, 'message': '用户创建不够三天,不能使用该功能'})
  73. response.status_code = 401
  74. return response
  75. # # # 将认证信息注入请求环境变量
  76. request.environ['token_id'] = login_info.get('tokenId')
  77. request.environ['app_id'] = login_info.get('appId')
  78. return f(*args, **kwargs)
  79. return decorated_function