实现思路
以下是使用 Flask 3 + Mistune 2 实现与 app2.js 相同功能的 Python Web 服务,包含 Markdown 解析(支持代码高亮、Mermaid、表格、公式)、文档保存/加载/列表查询等核心功能:
1. 先安装依赖
pip install flask==3.0.3 mistune==2.0.5 pygments python-multipart python-dotenv
2. 完整代码(app.py)
# -*- coding: utf-8 -*-
""" Markdown 在线编辑器 (支持表格/公式/Mermaid) """
import os
import json
from pathlib import Path
import mistune
from mistune.renderers import HTMLRenderer
from mistune.plugins import table, task_lists, footnotes
from pygments import highlight
from pygments.lexers import get_lexer_by_name, guess_lexer
from pygments.formatters import HtmlFormatter
from flask import Flask, render_template, request, jsonify, send_from_directory
# 初始化 Flask 应用
app = Flask(__name__, static_url_path='/', static_folder='public', template_folder='views')
# 配置
app.config['JSON_AS_ASCII'] = False
DOCS_DIR = Path(__file__).parent / 'docs'
DOCS_DIR.mkdir(exist_ok=True)
# ---- Markdown 解析配置 ----
# 自定义代码高亮渲染器(支持 Mermaid/代码高亮)
class CustomRenderer(HTMLRenderer):
def block_code():
info info.strip() == :
:
lexer = get_lexer_by_name(info.strip()) info guess_lexer(code)
:
lexer = guess_lexer(code)
formatter = HtmlFormatter(noclasses=, cssclass=, linenos=)
highlighted = highlight(code, lexer, formatter)
markdown_parser = mistune.create_markdown(
renderer=CustomRenderer(),
plugins=[, , ],
escape=
)
():
render_template(, title=)
():
:
data = request.get_json()
markdown = data.get(, )
markdown:
jsonify({: }),
html = markdown_parser(markdown)
jsonify({: html})
Exception e:
jsonify({: }),
():
:
data = request.get_json()
filename = data.get(, ).strip()
content = data.get(, ).strip()
filename content:
jsonify({: }),
file_path = DOCS_DIR /
(file_path, , encoding=) f:
f.write(content)
jsonify({: , : , : (file_path)})
Exception e:
jsonify({: }),
():
:
file_path = DOCS_DIR /
file_path.exists():
jsonify({: }),
(file_path, , encoding=) f:
content = f.read()
jsonify({: , : content})
Exception e:
jsonify({: }),
():
:
docs = []
file DOCS_DIR.glob():
docs.append({: file.stem, : (file)})
jsonify({: , : docs})
Exception e:
jsonify({: }),
():
send_from_directory(, path)
__name__ == :
app.run(host=, port=, debug=)

