Files
procas12f/interactive/main.py

134 lines
3.4 KiB
Python

#!/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("/<path:filename>")
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("/<path:path>")
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
})