🐸 青蛙编程网
首页 / Python / Flask / 3. 路由与模板

路由与模板

这是什么:路由 = 按网址决定走哪个函数;模板 = 把 HTML 放进单独的文件,由 Python 往里填数据。

为什么用:上一章的网站只有一个页面。再加页面就得靠函数返回一长串字符串,代码越堆越乱,HTML 和逻辑搅成一锅粥。

如何用:本章先用 @app.route() 给网址挂门牌,再把页面挪进 templates 目录,用 render_template 渲染。

路由:一个网址一个函数

@app.route() 就是门牌号。一个网站可以挂很多门牌,各进各的门:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def home():
    return "这是首页"

@app.route("/about")
def about():
    return "这是关于页"

@app.route("/user/<name>")          # 尖括号 = 动态参数
def user(name):
    return f"你好,{name}!欢迎来到青蛙小站"

if __name__ == "__main__":
    app.run(debug=True)

运行后分别访问这三个地址:

http://127.0.0.1:5000/              → 这是首页
http://127.0.0.1:5000/about         → 这是关于页
http://127.0.0.1:5000/user/小明      → 你好,小明!欢迎来到青蛙小站

<name> 是动态参数:网址里这一段写的是什么,就作为 name 传进函数。网址的一部分,变成了变量。

模板:把 HTML 从代码里搬出去

返回一句话没问题,但真正的网页是 HTML。全塞在 Python 字符串里会又长又乱,Flask 的办法是:HTML 单独放文件,Python 只递数据。

第一步,在 app.py 旁边建一个 templates 文件夹(名字必须是 templates,Flask 默认到这里找模板),放入 home.html:

<h1>你好,{{ name }}!</h1>
<p>你的爱好:</p>
<ul>
  {% for hobby in hobbies %}
    <li>{{ hobby }}</li>
  {% endfor %}
</ul>

第二步,让 Python 把数据递过去:

from flask import Flask, render_template

app = Flask(__name__)

hobbies = ["写代码", "打游戏", "撸猫"]

@app.route("/")
def home():
    return render_template("home.html", name="青蛙", hobbies=hobbies)

if __name__ == "__main__":
    app.run(debug=True)

刷新浏览器,你看到的是:

你好,青蛙!
你的爱好:
• 写代码
• 打游戏
• 撸猫

模板里负责「挖坑」的语法叫 Jinja2,只需记住两个符号:

写法 名字 作用
`{{ name }}` 变量 把 Python 传来的值填进 HTML
{% for ... %} ... {% endfor %} 语句 在 HTML 里写循环、判断等逻辑

render_template("home.html", name="青蛙", hobbies=hobbies) 的意思是:渲染这个文件,坑里的 name 填「青蛙」,hobbies 填那个列表。注意左边是模板里的名字,右边是 Python 里的变量,别填反了。

记忆口诀

`{{ }}` 填值,{% %} 写逻辑;HTML 管长相,Python 管数据。

动手改

  1. 给 user 页面加点料:改成返回 render_template 渲染的模板,显示 {name} 的专属页面
  2. 在模板里用 {% if hobbies %}...{% else %}...{% endif %}:列表为空时显示「暂时没有爱好」
  3. 新建一个 /luck 路由,用 random.choice(hobbies) 随机返回一个「今日幸运爱好」

下一章:表单与用户输入,让访客也能往网站里「说话」 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。