backend.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import os
  2. import tempfile
  3. from flask import Flask, request, send_file
  4. from celery import Celery, Task
  5. from celery.result import AsyncResult
  6. from pathlib import Path
  7. from tasks import translate_task
  8. app = Flask("pdf2zh")
  9. app.config.from_mapping(
  10. CELERY=dict(
  11. broker_url=os.environ.get("CELERY_BROKER", "redis://127.0.0.1:6379/0"),
  12. result_backend=os.environ.get("CELERY_RESULT", "redis://127.0.0.1:6379/0"),
  13. ignore_task_result=False,
  14. )
  15. )
  16. def celery_init_app(app: Flask) -> Celery:
  17. class FlaskTask(Task):
  18. def __call__(self, *args, **kwargs):
  19. with app.app_context():
  20. return self.run(*args, **kwargs)
  21. celery_app = Celery(app.name)
  22. celery_app.config_from_object(app.config["CELERY"])
  23. celery_app.Task = FlaskTask
  24. celery_app.set_default()
  25. celery_app.autodiscover_tasks()
  26. app.extensions["celery"] = celery_app
  27. return celery_app
  28. celery_app = celery_init_app(app)
  29. @app.route("/api/translate", methods=["POST"])
  30. def create_translate_tasks():
  31. f = request.files["source"]
  32. output_dir = Path(tempfile.mkdtemp())
  33. file_basename = ".".join(f.filename.split(".")[:-1])
  34. if len(file_basename) == 0:
  35. file_basename = "input"
  36. origin_pdf = output_dir / f"{file_basename}.pdf"
  37. f.save(origin_pdf)
  38. lang_in = request.args.get("lang_in", "auto")
  39. lang_out = request.args.get("lang_out", "zh")
  40. service = request.args.get("service", "google")
  41. task = translate_task.delay(
  42. str(output_dir), file_basename, lang_in, lang_out, service
  43. )
  44. return {"result_id": task.id}
  45. @app.route("/api/results/<id>", methods=["GET"])
  46. def check_translate_result(id: str):
  47. result = AsyncResult(id)
  48. return {"ready": result.ready(), "successful": result.successful()}
  49. @app.route("/api/results/<id>/<format>")
  50. def get_translate_result(id: str, format: str):
  51. result = celery_app.AsyncResult(id)
  52. if not result.ready():
  53. return {"error": "task not finished"}, 400
  54. if not result.successful():
  55. return {"error": "task failed"}, 400
  56. translated_pdf, dual_pdf = result.get()
  57. to_send = translated_pdf if format == "translated" else dual_pdf
  58. return send_file(to_send, "application/pdf")
  59. if __name__ == "__main__":
  60. app.run()