|
- from functools import wraps
- import time,uuid
- from flask import request, g, jsonify, make_response,current_app
- from common.log import logger
- from datetime import datetime
- from common import utils,redis_helper
-
- # 定义生成失败响应的函数
- def fail_response(code, error_message):
- return {
- "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
- "result": {
- "status": "failed",
- "code": code,
- "message": error_message
- }
- }
-
- # 定义生成成功响应的函数
- def success_response(data):
- return {
- "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],
- "data": data,
- "result": {
- "status": "succeed",
- "code": 200,
- "message": "请求成功!"
- }
- }
-
- def before_request():
- # 生成唯一的请求 ID
- request_id = str(uuid.uuid4())
- g.request_id = request_id
- log_content=f"{request_id} 请求: {request.method} {request.url} "
-
- # 如果是POST请求,记录请求体数据
- if request.method == 'POST':
- try:
- # 获取JSON格式的请求体数据
- post_data = request.get_json(silent=True)
- if post_data:
- log_content=log_content+f"POST JSON数据: {post_data}"
- else:
- # 如果JSON数据为空,尝试获取表单数据
- form_data = request.form
- if form_data:
- #logger.info(f"POST 表单数据: {form_data}")
- log_content=log_content+f"POST JSON数据: {post_data}"
- except Exception as e:
- logger.error(f"记录POST数据时发生错误: {e}")
-
- logger.info(log_content)
-
- g.start_time = time.time()
-
- def after_request(response):
- elapsed_time = time.time() - g.start_time
- request_id = g.get('request_id', 'unknown')
- log_content=f"{request_id} 响应: 用了 {elapsed_time:.4f} 秒"
- # return response
- if response.status_code >= 400:
- # 失败响应
- error_message = response.get_json(silent=True)['message']
- json_response = make_response(jsonify(fail_response(response.status_code, error_message)), response.status_code)
- log_content=log_content+f"失败响应: {json_response.get_json(silent=True)}"
- else:
- # 成功响应
- data = response.get_json(silent=True)
- json_response = make_response(jsonify(success_response(data)), response.status_code)
- log_content=log_content+f"成功响应: {json_response.get_json(silent=True)}"
-
- json_response.headers['X-Processed-Time'] = g.get('start_time', 'unknown')
-
- logger.info(f'{log_content}')
- return json_response
-
-
- def handle_exception(error):
- logger.error(f'发生异常: {error}')
- # response = jsonify({'error': str(error)})
- response = jsonify({'message': str(error)})
- response.status_code = 500
- return response
-
-
-
- def check_login_status(func):
- @wraps(func)
- def wrapper(*args, **kwargs):
-
- wxid = kwargs.get('wxid') # 从关键字参数中获取 wxid
- if not wxid:
- if len(args) > 0:
- wxid = args[0]
- else:
- raise ValueError("wxid is required")
-
- k, login_info = utils.get_login_info_by_wxid(wxid)
- if login_info.get('status') == "0":
- return # 如果 status 为 "0",直接返回,不执行原函数
-
- return func(*args, **kwargs)
- return wrapper
-
-
- def auth_required_time(f):
- @wraps(f)
- def decorated_function(*args, **kwargs):
- req = request.get_json()
- wxid = req.get("wxid")
- if not wxid:
- response=jsonify({'code': 400, 'message': '缺少wxid参数'})
- response.status_code = 400
- return response
-
- k, login_info = utils.get_login_info_by_wxid(wxid)
- if not login_info or login_info.get('status') == "0":
- response=jsonify({'code': 401, 'message': '用户没有登录'})
- response.status_code = 401
- return response
- # 获取登录信息的创建时间
- creation_timestamp=int(login_info.get('create_at',time.time()))
- current_timestamp = time.time()
- three_days_seconds = 3 * 24 * 60 * 60 # 三天的秒数
- diff_flag=(current_timestamp - creation_timestamp) >= three_days_seconds
- print(f"creation_timestamp:{creation_timestamp},current_timestamp:{current_timestamp},diff_flag:{diff_flag}")
- if not diff_flag:
- response=jsonify({'code': 401, 'message': '用户创建不够三天,不能使用该功能'})
- response.status_code = 401
- return response
-
- # # # 将认证信息注入请求环境变量
- request.environ['token_id'] = login_info.get('tokenId')
- request.environ['app_id'] = login_info.get('appId')
-
- return f(*args, **kwargs)
- return decorated_function
|