import os from glob import glob from flask import Flask, jsonify import frontmatter from markdown import markdown base_url = '/soupboat/atlas-api' # create flask application app = Flask(__name__) # prefix to add /SOUPBOAT/ATLAS-API to all the routes # and to leave the @app.route() decorator more clean class PrefixMiddleware(object): def __init__(self, app, prefix=""): self.app = app self.prefix = prefix def __call__(self, environ, start_response): if environ["PATH_INFO"].startswith(self.prefix): environ["PATH_INFO"] = environ["PATH_INFO"][len(self.prefix):] environ["SCRIPT_NAME"] = self.prefix return self.app(environ, start_response) else: start_response("404", [("Content-Type", "text/plain")]) return ["This url does not belong to the app.".encode()] app.wsgi_app = PrefixMiddleware( app.wsgi_app, prefix=base_url ) # definition of the routes @app.route('/') def contribution(contribution: None): try: with open(f'contributions/{contribution}.md', 'r') as f: meta, content = frontmatter.parse(f.read()) c = {**meta, 'content_html': markdown(content)} except FileNotFoundError: c = {"error": f"'{contribution}' is not a valid contribution!"} response = jsonify(c) response.headers.add('Access-Control-Allow-Origin', '*') return response @app.route('/contributions') def contributions(): files = glob("contributions/*.md") contrib = [] for file in files: with open(file, 'r') as f: meta, content = frontmatter.parse(f.read()) c = {**meta, 'content_html': markdown(content)} contrib.append(c) response = jsonify(contrib) response.headers.add('Access-Control-Allow-Origin', '*') return response app.run(port=3142)