#!/usr/bin/env python # -*- coding: utf-8 -*- import os from peewee import SQL from flask import Flask, jsonify, request, abort, send_from_directory from flask_cors import CORS from db import insert, index, Pridict2, PrimeDesign, table_columns app = Flask(__name__, static_folder="./frontend/dist") CORS(app) @app.route("/") def static_files(filename): """专门处理带扩展名的文件""" if "." not in filename: abort(404) # 无扩展名不应走这里 try: return send_from_directory(app.static_folder, filename) except FileNotFoundError: abort(404) # 静态文件不存在就是 404 @app.route("/", defaults={"path": ""}) @app.route("/") def main(path): """仅处理 SPA 路由(无扩展名)""" if "." in os.path.basename(path): # 包含扩展名?说明应该是静态文件,但没被上面的路由捕获 → 404 abort(404) return send_from_directory(app.static_folder, "index.html") def default_value(val, default): try: return int(val) except Exception: return default @app.route("/api/gene") def gene(): genes = set() source = request.args.get("source", "pridict2") tables = { "pridict2": Pridict2, "prime_design": PrimeDesign, } table = tables.get(source) if not table: return jsonify({"message": "No such table"}), 404 for i in table.select(table.gene.distinct()): genes.add(i.gene) return jsonify(sorted(genes)) @app.route("/api/records") def records(): source = request.args.get("source", "pridict2") tables = { "pridict2": Pridict2, "prime_design": PrimeDesign, } table = tables.get(source) if not table: return jsonify({"message": "No such table"}), 404 columns = table_columns(table) where = None for i in ["gene", "dst", "src"]: value = request.args.get(i) if value: if where is None: where = (SQL(i) == value) else: where = (where) & (SQL(i) == value) for i in ["pbs_len", "rtt_len"]: value = default_value(request.args.get(i), 0) if value: if where is None: where = (SQL(i) <= value) else: where = (where) & (SQL(i) <= value) query = table.select().where(where) total = query.count() order_by = request.args.get("order_by") if order_by and order_by in columns: order = request.args.get("order", "asc") if "desc" in order: query = query.order_by(SQL(order_by).desc()) else: query = query.order_by(SQL(order_by)) else: query = query.order_by(table.gene, table.aa, table.src, table.dst) offset = default_value(request.args.get("offset"), 1) if offset <= 0: offset = 1 length = default_value(request.args.get("length"), 1) if length > 200: length = 200 query = query.offset((int(offset) - 1) * length).limit(int(length)) print(query.sql()) return jsonify({ "data": [x for x in query.dicts()], "total": total, "offset": offset, "length": length, }) def main(host: str="0.0.0.0", port=5555): app.run(host=host, port=port, threaded=True, debug=True) if __name__ == "__main__": from fire import Fire Fire({ "insert": insert, "index": index, "server": main })