134 lines
3.4 KiB
Python
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
|
|
})
|