rest_api.py 2.5 KB

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