final save code

This commit is contained in:
xsl
2025-08-02 13:11:45 +08:00
commit ae68a9e201
37 changed files with 289714 additions and 0 deletions
Executable
+228
View File
@@ -0,0 +1,228 @@
import time
import logging
import redis
import uuid
import json
from flask import Flask, request, jsonify
from datetime import datetime, timedelta
from config import QUEUE_NAME, DEFAULT_TIMEOUT, KEY_QUEUE_LOCK_NAME, acquire_lock
# 创建 logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # 设置 logger 的级别
# 获取当前日期和时间
now = datetime.now()
# 格式化为字符串(例如:2023-10-25 14:30:45
date_time_str = now.strftime("%Y-%m-%d_%H:%M:%S")
# 创建文件 handler
file_handler = logging.FileHandler(f'/var/log/meidaojia/app_{date_time_str}.log')
file_handler.setLevel(logging.INFO)
file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(file_formatter)
# 创建控制台 handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
# 添加 handlers 到 logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)
app = Flask(__name__)
# 配置
from config import REDIS_HOST
from config import REDIS_PORT
from config import REDIS_DB
# 创建 Redis 连接池
redis_pool = redis.ConnectionPool(
host=REDIS_HOST,
port=REDIS_PORT,
db=REDIS_DB,
max_connections=2000 # 根据实际情况调整
)
def get_redis_conn():
"""获取 Redis 连接"""
return redis.Redis(connection_pool=redis_pool)
get_redis_conn().set(QUEUE_NAME, "[]")
def pushStr2Queue(key, data_str):
redis_conn = get_redis_conn()
lock = acquire_lock(redis_conn, KEY_QUEUE_LOCK_NAME)
if lock:
try:
redis_conn.set(key, data_str, ex=60)
key_queue_str = redis_conn.get(QUEUE_NAME).decode("utf-8")
key_queue = json.loads(key_queue_str)
key_queue.append(key)
logger.info(f"pushStr2Queue queue len:{key_queue}")
key_queue_str = json.dumps(key_queue)
redis_conn.set(QUEUE_NAME, key_queue_str)
finally:
lock.release()
else:
logger.error(f"pushStr2Queue get lock error {data_str}")
@app.route('/hairColor/v2', methods=['POST'])
def api_hairColor_v2():
# 获取请求参数
data = request.get_json()
if not data or 'img' not in data:
return jsonify({'msg': 'Missing img parameter', "state":-1, "data":"" }), 400
if not data or 'rgb' not in data:
return jsonify({'msg': 'Missing "rgb": parameter', "state":-1, "data":""}), 400
if not data or 'ratio' not in data:
return jsonify({'msg': 'Missing "ratio": parameter', "state":-1, "data":""}), 400
if not data or 'output_format' not in data:
return jsonify({'msg': 'Missing "output_format": parameter', "state":-1, "data":""}), 400
key = str(uuid.uuid4())
redis_conn = get_redis_conn()
# if len(data['img']) > 256:
# redis_conn.set(f"img_{key}", data['img'], ex=60)
# data['img'] = "base64"
task_data = {}
task_data['key'] = key
task_data['api'] = "/hairColor/v2"
task_data['request'] = data
logger.info(f"request hairColor/v2 img:{data['img'][:64]}, rgb:{data['rgb']}, ratio:{data['ratio']} output_format:{data['output_format']}")
task_data_str = json.dumps(task_data)
pushStr2Queue(key, task_data_str)
timeout = DEFAULT_TIMEOUT
start_time = datetime.now()
result_key = f"result_{key}"
result_status_key = f"result_status_code_{key}"
while (datetime.now() - start_time).seconds < timeout:
if redis_conn.exists(result_key):
result_str = redis_conn.get(result_key)
return result_str, int(redis_conn.get(result_status_key)), {'Content-Type': 'application/json'}
time.sleep(0.1)
logger.error(f"request hairColor time out ")
return jsonify({
'msg': f'Timeout after {timeout} seconds, http time out'
, "state":-1, "data":""
}), 408
@app.route('/api/swapHair/v1', methods=['POST'])
def api_swapHair_v1():
if not request.is_json:
return jsonify({"error": "Request must be JSON"}), 400
# 获取请求参数
data = request.get_json()
if not data or 'hair_id' not in data:
return jsonify({'msg': 'Missing hair_id parameter', "state":-1, "data":"" }), 400
if not data or 'task_id' not in data:
return jsonify({'msg': 'Missing task_id parameter', "state":-1, "data":""}), 400
if not data or 'user_img_path' not in data:
return jsonify({'msg': 'Missing user_img_path parameter', "state":-1, "data":""}), 400
if not data or 'is_hr' not in data:
return jsonify({'msg': 'Missing is_hr parameter', "state":-1, "data":""}), 400
if not data or 'output_format' not in data:
return jsonify({'msg': 'Missing output_format parameter', "state":-1, "data":""}), 400
redis_conn = get_redis_conn()
key = str(uuid.uuid4())
# if len(data['user_img_path']) > 256:
# redis_conn.set(f"img_{key}", data['user_img_path'], ex=60)
# data['user_img_path'] = "base64"
task_data = {}
task_data['key'] = key
task_data['api'] = "/api/swapHair/v1"
task_data['request'] = data
logger.info(f"request /api/swapHair/v1 user_img_path:{data['user_img_path'][:64]} hair_id:{data['hair_id']}")
task_data_str = json.dumps(task_data)
pushStr2Queue(key, task_data_str)
timeout = DEFAULT_TIMEOUT
start_time = datetime.now()
result_key = f"result_{key}"
result_status_key = f"result_status_code_{key}"
while (datetime.now() - start_time).seconds < timeout:
if redis_conn.exists(result_key):
result_str = redis_conn.get(result_key)
return result_str, int(redis_conn.get(result_status_key)), {'Content-Type': 'application/json'}
time.sleep(0.1)
logger.error(f"request /api/swapHair/v1 time out")
return jsonify({
'msg': f'Timeout after {timeout} seconds, http time out'
, "state":-1, "data":""
}), 408
# @app.route('/api/uploadHair/v1', methods=['POST'])
# def api_uploadHair_v1():
# # 获取请求参数
# data = request.get_json()
# if not data or 'img_lists' not in data:
# return jsonify({'msg': 'Missing img_lists parameter', "state":-1, "data":"" }), 400
# if not data or '"hair_id": ' not in data:
# return jsonify({'msg': 'Missing "hair_id": parameter', "state":-1, "data":""}), 400
# if not data or 'output_format' not in data:
# logger.warning(f"api_swapHair_v1 no output_format task_id:{data['task_id']}")
# key = str(uuid.uuid4())
# redis_conn = get_redis_conn()
# task_data = {}
# task_data['key'] = key
# task_data['api'] = "/api/uploadHair/v1"
# task_data['request'] = data
# logger.info(f"request api_uploadHair_v1 task_data: {json.dumps(task_data)}")
# task_data_str = json.dumps(task_data)
# pushStr2Queue(task_data_str)
# timeout = DEFAULT_TIMEOUT
# start_time = datetime.now()
# result_key = f"result_{key}"
# while (datetime.now() - start_time).seconds < timeout:
# if redis_conn.exists(result_key):
# result_str = redis_conn.get(result_key)
# result = json.loads(result_str)
# if result['state'] == 0:
# return jsonify(result), 200
# else:
# return jsonify(result), 500
# time.sleep(0.1)
# logger.error(f"request api_uploadHair_v1 time out")
# return jsonify({
# 'msg': f'Timeout after {timeout} seconds, http time out'
# , "state":-1, "data":""
# }), 408
if __name__ == '__main__':
# 启动Flask应用,启用多线程处理
app.run(
host='0.0.0.0',
port=80,
threaded=True, # 启用多线程处理并发请求
debug=False # 生产环境应设置为False
)