如何用Flask或Bottle实现无硬编码的动态静态页面路由?
嘿,这个需求我熟!不管你用Flask还是Bottle,都能轻松实现这种动态映射,不用费劲一个个硬编码20多个页面路径~下面分别给你两种框架的解决方案:
Flask 实现方案
核心思路是用动态路由捕获URL中/之后的任意路径,然后自动拼接.html后缀去指定目录找对应文件。
基础版本代码
from flask import Flask, send_from_directory import os app = Flask(__name__) # 配置你的静态HTML文件根目录,根据实际路径调整 HTML_FILE_DIR = os.path.join(os.path.dirname(__file__), 'myapp', 'html') @app.route('/<path:page_name>') def serve_html(page_name): # 把捕获到的路径拼接成带.html后缀的文件名 return send_from_directory(HTML_FILE_DIR, f"{page_name}.html") if __name__ == '__main__': app.run(debug=True)
优化版本(增加404处理)
上面的代码如果遇到不存在的页面会直接报服务器错误,建议加上文件存在判断,返回友好的404页面:
from flask import Flask, send_from_directory, abort import os from os.path import exists, join app = Flask(__name__) HTML_FILE_DIR = join(os.path.dirname(__file__), 'myapp', 'html') @app.route('/<path:page_name>') def serve_html(page_name): target_file = join(HTML_FILE_DIR, f"{page_name}.html") # 检查文件是否存在 if not exists(target_file): abort(404) return send_from_directory(HTML_FILE_DIR, f"{page_name}.html") # 自定义404提示页面 @app.errorhandler(404) def page_not_found(e): return "哎呀,这个页面找不到啦😯", 404 if __name__ == '__main__': app.run(debug=True)
小提示:如果你的页面都是单级路径(比如/about、/contact),可以把<path:page_name>换成<string:page_name>,限制只能匹配单级路径,避免误匹配多级目录。另外,记得把这个动态路由放在所有特定路由的后面(比如原有的/helloworld路由),不然会覆盖掉之前的特定路由哦!
Bottle 实现方案
Bottle的实现思路和Flask几乎一致,同样用动态路由捕获路径,再返回对应静态文件。
基础版本代码
from bottle import Bottle, static_file import os app = Bottle() HTML_FILE_DIR = os.path.join(os.path.dirname(__file__), 'myapp', 'html') @app.route('/<page_name:path>') def serve_html(page_name): return static_file(f"{page_name}.html", root=HTML_FILE_DIR) if __name__ == '__main__': app.run(debug=True)
优化版本(增加404处理)
from bottle import Bottle, static_file, abort import os from os.path import exists, join app = Bottle() HTML_FILE_DIR = join(os.path.dirname(__file__), 'myapp', 'html') @app.route('/<page_name:path>') def serve_html(page_name): target_file = join(HTML_FILE_DIR, f"{page_name}.html") if not exists(target_file): abort(404) return static_file(f"{page_name}.html", root=HTML_FILE_DIR) # 自定义404页面 @app.error(404) def error_404(error): return "抱歉,该页面不存在😅", 404 if __name__ == '__main__': app.run(debug=True)
注意:Bottle里的<page_name:path>同样支持多级路径匹配,要是只需要单级路径,直接用<page_name>就可以啦。
额外提醒
- 确保你的
myapp/html目录结构正确:比如请求/test,对应的文件必须是myapp/html/test.html - 生产环境部署时,建议用Nginx等反向代理直接处理静态文件请求,性能会比Python服务处理更好;开发阶段用上面的代码完全够用。
内容的提问来源于stack exchange,提问作者Basj




