This repository has been archived on 2025-12-28. You can view files and clone it, but cannot push or open issues or pull requests.
simple-blog-api/app.py
2021-06-02 18:17:11 +09:30

102 lines
2.6 KiB
Python

from bs4 import BeautifulSoup
from markdown import markdown
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
import os
class Post(Resource):
def get(self, slug=""):
path = "./posts"
files = os.listdir(path)
# general file name format will be:
# <iso date>_<category>_<slug>.md
# eg 2021-06-02_projects_my-kubernetes-cluster.md
if slug == "":
_file = random.choice(files)
tokens = _file.split('_')
_date = tokens[0]
_category = tokens[1]
_slug = tokens[2].replace('.md', '')
_post = {
"slug": _slug,
"date": _date,
"category": _category,
"content": render(open(path+'/'+_file, 'r').read())
}
return _post, 200
for _file in files:
tokens = _file.split('_')
_date = tokens[0]
_category = tokens[1]
_slug = tokens[2].replace('.md', '')
if(_slug == slug):
_post = {
"slug": _slug,
"date": _date,
"category": _category,
"content": render(open(path+'/'+_file, 'r').read())
}
return _post, 200
return "Post not found", 400
class Posts(Resource):
def get(self, slug=""):
path = "./posts"
files = os.listdir(path)
posts = []
# general file name format will be:
# <iso date>_<category>_<slug>.md
# eg 2021-06-02_projects_my-kubernetes-cluster.md
for _file in files:
tokens = _file.split('_')
_date = tokens[0]
_category = tokens[1]
_slug = tokens[2].replace('.md', '')
_post = {
"slug": _slug,
"date": _date,
"category": _category,
"content": render(open(path+'/'+_file, 'r').read())
}
posts.append(_post)
return posts, 200
def render(content):
"""Render Markdown Syntax to final HTML."""
soup = BeautifulSoup(markdown(content, extensions=['codehilite']), features="html.parser")
_add_a_attrs(soup)
return soup.decode()
def _add_a_attrs(soup):
"""Add HTML attrs to our link elements"""
for tag in soup.find_all("a"):
tag['rel'] = "nofollow"
tag['target'] = "_blank"
api = Flask(__name__)
_api = Api(api)
_api.add_resource(Post, "/post/<string:slug>")
_api.add_resource(Posts, "/posts")