瀏覽代碼

新增注册接口

yes-yes-yes-k 5 天之前
父節點
當前提交
46813e1301
共有 1 個文件被更改,包括 26 次插入19 次删除
  1. 26 19
      api/app/__init__.py

+ 26 - 19
api/app/__init__.py

@@ -1,7 +1,6 @@
-from flask import Flask, jsonify, request
+from flask import Flask, jsonify, request, make_response
 import os
 
-from flask import Flask
 from flask_cors import CORS
 from flask_sqlalchemy import SQLAlchemy
 from flask_migrate import Migrate
@@ -9,14 +8,14 @@ import logging
 import pandas as pd
 from datetime import datetime
 import json
-from .utils import get_current_data, get_dataset_by_id, get_table_data ,get_table_metal_averages
+from .utils import get_current_data, get_dataset_by_id, get_table_data, get_table_metal_averages
 
 # 先创建SQLAlchemy实例,确保其他模块可以导入
 db = SQLAlchemy()
 
 # 导入配置和工具函数(在db定义之后)
 from . import config
-from .utils import get_current_data, get_dataset_by_id
+
 
 def create_app():
     app = Flask(__name__)
@@ -26,8 +25,8 @@ def create_app():
     app.config.from_object(config.Config)
     app.logger.setLevel(logging.DEBUG)
     
-    # 初始化CORS
-    CORS(app)
+    # 初始化CORS(允许所有源,所有方法,带凭证)
+    CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True)
     
     # 初始化数据库
     db.init_app(app)
@@ -38,11 +37,25 @@ def create_app():
     # 注册蓝图
     from . import routes, frontend
     app.register_blueprint(routes.bp)
-    app.register_blueprint(frontend.bp)
+    app.register_blueprint(frontend.bp,url_prefix="/admin")
 
+    # 注册自定义接口
     register_api_routes(app)
+
+    # -------- 新增:统一处理 OPTIONS 预检请求 --------
+    @app.before_request
+    def handle_options():
+        if request.method == "OPTIONS":
+            response = make_response()
+            response.headers.add("Access-Control-Allow-Origin", "*")
+            response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization")
+            response.headers.add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
+            return response
+    # --------------------------------------------
+
     return app
 
+
 def safe_data_conversion(df):
     """安全转换DataFrame为可序列化的字典列表,处理特殊数据类型"""
     # 处理日期时间类型
@@ -69,43 +82,37 @@ def safe_data_conversion(df):
     
     return [serialize_item(item) for item in data_list]
 
+
 def register_api_routes(app):
     # 新增:通用表查询接口
     @app.route('/api/table-data', methods=['GET'])
     def api_table_data():
-        # 1. 获取前端传的表名
         table_name = request.args.get('table_name')
         if not table_name:
             return jsonify({"error": "请传入 table_name 参数(如 ?table_name=dataset_35)"}), 400
 
         try:
-            # 2. 调用工具函数查询数据
             df = get_table_data(db.session, table_name)
-            # 3. 安全转换数据(复用之前的 safe_data_conversion 函数)
             data = safe_data_conversion(df)
             return jsonify({"success": True, "data": data})
-        except ValueError as e:  # 非法表名
+        except ValueError as e:
             return jsonify({"success": False, "error": str(e)}), 400
-        except Exception as e:  # 其他错误
+        except Exception as e:
             app.logger.error(f"查询表 {table_name} 失败: {str(e)}", exc_info=True)
             return jsonify({"success": False, "error": str(e)}), 500
         
-        # 新增接口:查询金属平均值(/api/table-averages)
+    # 新增接口:查询金属平均值(/api/table-averages)
     @app.route('/api/table-averages', methods=['GET'])
     def api_table_averages():
-        # 1. 获取参数
         table_name = request.args.get('table_name')
         if not table_name:
             return jsonify({"error": "缺少参数:table_name"}), 400
 
         try:
-            # 2. 调用工具函数计算平均值(复用 db.session)
             averages = get_table_metal_averages(db.session, table_name)
-            # 3. 返回结果
             return jsonify({"success": True, "averages": averages})
-        except ValueError as e:  # 表名校验失败(预期错误)
+        except ValueError as e:
             return jsonify({"success": False, "error": str(e)}), 400
-        except Exception as e:  # 其他运行时错误(如数据库连接失败)
+        except Exception as e:
             app.logger.error(f"计算 {table_name} 平均值失败: {str(e)}", exc_info=True)
             return jsonify({"success": False, "error": str(e)}), 500
-