ModelHandle/tools/step_service/server.py

62 lines
1.9 KiB
Python

import pathlib
import sys
from flask import Flask, Response, jsonify, request
try:
from .freecad_worker import FreeCADWorker
from .step_tree import load_deleted_paths
except ImportError:
repo_root = pathlib.Path(__file__).resolve().parents[2]
if str(repo_root) not in sys.path:
sys.path.insert(0, str(repo_root))
from tools.step_service.freecad_worker import FreeCADWorker
from tools.step_service.step_tree import load_deleted_paths
def create_app(worker=None):
app = Flask(__name__)
step_worker = worker or FreeCADWorker()
@app.after_request
def add_cors_headers(response):
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = "POST, OPTIONS"
response.headers["Access-Control-Allow-Headers"] = "Content-Type"
return response
@app.route("/save-step", methods=["OPTIONS"])
def save_step_options():
return ("", 204)
@app.post("/save-step")
def save_step():
uploaded_file = request.files.get("file")
if uploaded_file is None or uploaded_file.filename == "":
return jsonify({"message": "Missing STEP file."}), 400
raw_deleted_paths = request.form.get("deletedPaths", "[]")
try:
deleted_paths = load_deleted_paths(raw_deleted_paths)
except ValueError as err:
return jsonify({"message": str(err)}), 400
output_bytes, output_name = step_worker.trim_step_file(
uploaded_file.filename,
uploaded_file.read(),
deleted_paths,
)
return Response(
output_bytes,
mimetype="application/step",
headers={
"Content-Disposition": f'attachment; filename="{output_name}"'
},
)
return app
if __name__ == "__main__":
create_app().run(host="127.0.0.1", port=17890, debug=False)