app_v2.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from flask import Flask, request, jsonify
  2. # from flask_cors import CORS # 跨域支持
  3. from typing import Dict, Any, List
  4. import traceback
  5. import logging
  6. # 首先导入日志配置模块,确保日志系统在导入其他模块之前就配置好
  7. import logger_config
  8. # 确保日志系统已正确配置(因为可能多次导入,特别是gunicorn多worker情况下)
  9. logger_config.setup_logging()
  10. # 获取应用日志器
  11. logger = logger_config.get_logger("TextGenerationAPI")
  12. # 现在导入chat模块(它会导入conf等模块,此时日志已经配置好了)
  13. from chat import gen_title, generate_text, check_image_url
  14. # 验证chat和llm模块的logger是否正确配置(在导入后验证)
  15. chat_logger = logging.getLogger("chat")
  16. llm_logger = logging.getLogger("llm")
  17. # 确保chat和llm的logger有handler(通过propagate到root logger)
  18. chat_logger.propagate = True
  19. llm_logger.propagate = True
  20. logger.info("Flask应用启动,日志系统已初始化")
  21. logger.info(f"chat模块logger级别: {chat_logger.getEffectiveLevel()}, llm模块logger级别: {llm_logger.getEffectiveLevel()}")
  22. logger.info(f"根logger级别: {logging.root.getEffectiveLevel()}, handlers数量: {len(logging.root.handlers)}")
  23. app = Flask(__name__)
  24. # CORS(app) # 允许所有域访问(生产环境应限制)
  25. @app.route('/api/description', methods=['POST'])
  26. def request_description():
  27. """文本生成核心接口
  28. 请求体要求(JSON格式):
  29. {
  30. "plm_info": "商品详细信息文本",
  31. "img": "https://example.com/image.jpg",
  32. "graphic_label": ["标签1", "标签2"]
  33. }
  34. """
  35. try:
  36. data = request.get_json()
  37. if not data:
  38. return jsonify({"error": "The request body must be in JSON format."}), 400
  39. logger.info(f"收到请求数据:{data}")
  40. required_fields = ["spu",'plm_info', 'img', 'graphic_label']
  41. if 'plm_info' not in data or len(data["plm_info"])<1:
  42. return jsonify({"error": f"Contact the designer to maintain product selling points data(plm_info)"}), 400
  43. missing = [field for field in required_fields if field not in data]
  44. if missing:
  45. return jsonify({"error": f"Necessary values are missing: {missing}"}), 400
  46. is_valid, message=check_image_url(data['img'])
  47. if not is_valid:
  48. return jsonify({"error": message}), 400
  49. if not isinstance(data['graphic_label'], list) or \
  50. not all(isinstance(item, str) for item in data['graphic_label']):
  51. return jsonify({"error": "The graphic_label must be a list of strings."}), 400
  52. en,kw = generate_text(
  53. plm_info=data['plm_info'],
  54. img=data['img'],
  55. graphic_label=data['graphic_label']
  56. )
  57. logger.info(f"生成描述:{en}")
  58. logger.info(f"生成关键词:{kw}")
  59. return jsonify({
  60. "spu": data['spu'], # 示例请求ID(实际应生成唯一标识)
  61. "result":{"descr":en,
  62. "keywords":kw}
  63. }), 200
  64. except Exception as e:
  65. logger.error(f"处理失败: {str(e)}\n{traceback.format_exc()}")
  66. return jsonify({
  67. "error": "Internal server error.",
  68. "detail": str(e)
  69. }), 500
  70. @app.route('/api/title', methods=['POST'])
  71. def request_title():
  72. """文本生成核心接口
  73. 请求体要求(JSON格式):
  74. {
  75. "plm_info": "商品详细信息文本",
  76. "img": "https://example.com/image.jpg",
  77. "graphic_label": ["标签1", "标签2"]
  78. }
  79. """
  80. try:
  81. data = request.get_json(force=True)
  82. if not data:
  83. return jsonify({"error": "The request body must be in JSON format."}), 400
  84. logger.info(f"收到请求数据:{data}")
  85. required_fields = ["spu",'desc']
  86. missing = [field for field in required_fields if field not in data]
  87. if missing:
  88. return jsonify({"error": f"Necessary values are missing: {missing}"}), 400
  89. logger.info(f"11111111111数据完整:{data}")
  90. if not isinstance(data['tags'], list) or \
  91. not all(isinstance(item, str) for item in data['tags']) :
  92. return jsonify({"error": "The tags must be a list of strings."}), 400
  93. reference_title = data.get("reference_title", "")
  94. tags = data.get("tags", "")
  95. logger.info(f"数据完整:{data}")
  96. result = gen_title(
  97. info=data['desc'],
  98. tags=tags,
  99. referencr_title=reference_title
  100. )
  101. logger.info(f"生成标题:{result}")
  102. # 5. 构造标准化响应
  103. return jsonify({
  104. "spu": data['spu'], # 示例请求ID(实际应生成唯一标识)
  105. "result":result
  106. }), 200
  107. except Exception as e:
  108. # 异常处理与日志记录
  109. logger.error(f"处理失败: {str(e)}\n{traceback.format_exc()}")
  110. return jsonify({
  111. "error": "服务器内部错误",
  112. "detail": str(e)
  113. }), 500
  114. if __name__ == '__main__':
  115. # 启动服务(生产环境应使用WSGI服务器)
  116. app.run(host='0.0.0.0', port=5555, debug=False)