You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:14:17