rest_api.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from os import environ
  2. from flask import Flask, Response, jsonify, render_template, request
  3. from transliterator.tables import list_tables, load_table
  4. from transliterator.trans import transliterate
  5. def create_app():
  6. flask_env = environ.get("TXL_APP_MODE", "production")
  7. app = Flask(__name__)
  8. app.config.update({
  9. "ENV": flask_env,
  10. "SECRET_KEY": environ["TXL_FLASK_SECRET"],
  11. # Prod requires the application to be behind a web server, or static
  12. # files won't be served directly by Flask using this option.
  13. "USE_X_SENDFILE": flask_env == "production",
  14. "JSON_AS_ASCII": False,
  15. "JSONIFY_PRETTYPRINT_REGULAR": True,
  16. })
  17. return app
  18. app = create_app()
  19. @app.route("/", methods=["GET"])
  20. def index():
  21. return render_template("index.html", languages=list_tables())
  22. @app.route("/health", methods=["GET"])
  23. def health_check():
  24. return "I'm alive!\n"
  25. @app.route("/languages", methods=["GET"])
  26. def list_languages():
  27. return jsonify(list_tables())
  28. @app.route("/table/<lang>")
  29. def dump_table(lang):
  30. """
  31. Dump parsed transliteration table for a language.
  32. """
  33. return jsonify(load_table(lang))
  34. @app.route("/transliterate", methods=["POST"])
  35. def transliterate_form():
  36. """ UI version of the `trans` endpoint. Passes everything via form. """
  37. return transliterate_req(
  38. request.form["lang"], request.form.get("r2s", False))
  39. @app.route("/trans/<lang>/r2s", methods=["POST"], defaults={"r2s": True})
  40. @app.route("/trans/<lang>", methods=["POST"])
  41. def transliterate_req(lang, r2s=False):
  42. in_txt = request.form["text"]
  43. if not len(in_txt):
  44. return ("No input text provided! ", 400)
  45. try:
  46. out = transliterate(in_txt, lang, r2s)
  47. except (NotImplementedError, ValueError) as e:
  48. return (str(e), 400)
  49. rsp = Response(out, mimetype="text/plain")
  50. rsp.headers["Content-Type"] = "text/plain; charset=utf-8"
  51. return rsp