如何用Bottle/Flask将多页面路由至同一模板并获取页面名称
解决Flask/Bottle多页面复用模板+优雅获取页面名称的方案
嘿,你之前用字符串切割str(request)的方式确实太脆弱了——框架版本更新说不定就会改变request对象的字符串输出格式,到时候代码直接就崩了!其实不管是Flask还是Bottle,都有官方支持的简洁方法来实现你的需求:多页面路由到同一模板、自动处理静态文件,还能优雅获取test1/hello2这类页面名称。
Flask 实现方案
方法1:路由变量匹配(推荐,灵活可控)
直接用路由变量捕获页面名称,视图函数接收后传给模板,还能加白名单过滤非法访问:
from flask import Flask, render_template app = Flask(__name__) # 定义允许访问的页面白名单 ALLOWED_PAGES = {"test1", "hello2", "about"} @app.route("/<page_name>") def show_page(page_name): if page_name not in ALLOWED_PAGES: return "页面不存在", 404 # 直接把页面名称传给模板 return render_template("page.html", page_name=page_name)
方法2:固定路由绑定同一视图
如果你的页面路由是固定的(比如只有/test1和/hello2),可以给多个路由绑定同一个视图,然后通过request.path提取页面名称:
from flask import Flask, render_template, request app = Flask(__name__) @app.route("/test1") @app.route("/hello2") def show_fixed_page(): # 去掉路径开头的斜杠,直接得到页面名称 page_name = request.path.lstrip("/") return render_template("page.html", page_name=page_name)
Bottle 实现方案
方法1:路由变量匹配
和Flask思路类似,用路由变量捕获页面名称,灵活又安全:
from bottle import Bottle, template app = Bottle() ALLOWED_PAGES = {"test1", "hello2"} @app.route("/<page_name>") def show_page(page_name): if page_name not in ALLOWED_PAGES: return "页面不存在", 404 return template("page.html", page_name=page_name)
方法2:给路由附加自定义参数
如果是固定路由,还可以在装饰器里直接给路由加自定义参数,通过request.route.config获取:
from bottle import Bottle, template, request app = Bottle() @app.route("/test1", page="test1") @app.route("/hello2", page="hello2") def show_fixed_page(): # 直接获取路由上定义的page参数 page_name = request.route.config.get("page") return template("page.html", page_name=page_name)
模板与静态文件处理
模板显示页面名称
你的page.html只需要直接渲染传过来的page_name变量就行:
<!DOCTYPE html> <html> <head> <title>{{ page_name }}</title> </head> <body> <h1>当前页面:{{ page_name }}</h1> </body> </html>
静态文件自动路由
- Flask:默认会自动路由
/static/路径下的文件,把静态文件(比如CSS、JS、图片)放在项目根目录的static文件夹里即可,访问时用/static/css/style.css这种路径。 - Bottle:默认同样会处理
/static/路径,或者你可以手动指定静态文件目录:app.static("/static/", root="./my_static_files")
这样既不用写hack的字符串切割,代码也更清晰、稳定,完全符合框架的设计规范~
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

