路由与模板
这是什么:路由 = 按网址决定走哪个函数;模板 = 把 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 管数据。
动手改
- 给
user页面加点料:改成返回render_template渲染的模板,显示{name} 的专属页面 - 在模板里用
{% if hobbies %}...{% else %}...{% endif %}:列表为空时显示「暂时没有爱好」 - 新建一个
/luck路由,用random.choice(hobbies)随机返回一个「今日幸运爱好」
下一章:表单与用户输入,让访客也能往网站里「说话」 🐸