3、第一个 Flask 应用:搭建最简 Web 服务器,理解路由与视图函数
好,咱们开始动手了。
前面两章我们把环境搭好,概念也理清了。这一章,我带你写一个真正的 Flask 应用。别怕,代码不超过十行。你想想看,一个能跑起来的 Web 服务器,居然这么简单?嗯,就是这么简单。
3.1 从零开始:一个文件搞定
我个人习惯,学新框架时先建一个空目录,里面只放一个 app.py。这样思路最清晰,不会被乱七八糟的文件搞晕。
打开你的编辑器,新建文件,输入以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
保存,然后在终端里运行:
python app.py
你会看到类似这样的输出:
* Serving Flask app 'app'
* Debug mode: on
* Running on http://127.0.0.1:5000
打开浏览器,访问 http://127.0.0.1:5000。看到了吗?页面上显示着「Hello, World!」。你的第一个 Web 服务器,跑起来了。
核心要点:Flask 应用本质上就是一个 Python 对象,它监听某个端口,等待 HTTP 请求,然后返回响应。
3.2 拆解代码:每一行都在干什么
代码虽短,但每一行都有讲究。咱们一行一行来看。
3.2.1 导入与初始化
from flask import Flask
app = Flask(__name__)
Flask 是框架的核心类。我们创建了一个实例 app,参数 __name__ 告诉 Flask 当前模块的名字。这个参数很重要,Flask 要靠它来找到静态文件和模板文件的位置。
我在项目中遇到过一个问题:有人把 __name__ 写成了字符串 '__main__',结果模板死活加载不出来。后来排查了半天,才发现是这里写错了。所以,老老实实用 __name__ 就好。
3.2.2 路由与视图函数
@app.route('/')
def hello():
return 'Hello, World!'
这里有两个关键概念:路由和视图函数。
- 路由:
@app.route('/')是一个装饰器,它告诉 Flask:当用户访问根路径/时,请执行下面的函数。 - 视图函数:
hello()就是视图函数。它返回一个字符串,这个字符串就是浏览器看到的页面内容。
说白了,路由就是「门牌号」,视图函数就是「房间里的人」。用户敲哪个门,就由对应的人来接待。
小技巧:视图函数的名字可以随便起,但最好有意义。比如处理用户登录的视图叫 login(),处理文章列表的叫 articles()。这样代码可读性高,别人一看就懂。
3.2.3 启动服务器
if __name__ == '__main__':
app.run(debug=True)
这个 if 判断是 Python 的标准写法,确保只有直接运行这个文件时才启动服务器。如果被其他模块导入,就不会自动运行。
debug=True 这个参数,我建议你开发时一定要加上。它有两个好处:
- 代码改了,服务器自动重启,不用手动关掉再开。
- 出错了,浏览器会显示详细的错误信息,方便调试。
注意:生产环境千万不要用 debug=True。我曾经吃过这个亏——线上环境忘了关调试模式,结果用户看到了完整的报错信息,连数据库密码都暴露了。嗯,那场面,相当尴尬。
3.3 理解路由:不止一个页面
一个真正的网站不可能只有一个页面。咱们来加几个路由试试。
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)
看到了吗?路由可以带参数。<name> 是一个动态部分,你访问 /user/张三,视图函数就会收到 name='张三'。
我刚开始学的时候,觉得这个 <> 语法很神奇。后来才知道,Flask 底层用的是 Werkzeug 的路由系统,它会把 URL 中的动态部分自动提取出来,传给视图函数。
3.4 知识体系:一张图看懂
下面这张 SVG 图,帮你梳理本章的核心逻辑:
3.5 避坑指南:我踩过的那些坑
讲几个我当年犯过的错,你遇到了能少走弯路。
- 端口被占用:运行
app.run()时提示端口被占用,八成是你之前开的服务器没关。按Ctrl+C停掉,或者换个端口:app.run(port=5001)。 - 路由写错:
@app.route('/about')和@app.route('/about/')是不一样的。前者访问/about/会 404,后者会自动重定向。我建议统一风格,要么都加斜杠,要么都不加。 - 视图函数忘了 return:Flask 要求视图函数必须返回一个值。如果不 return,浏览器会一直转圈,最后超时。我曾经调试了半天,结果发现是忘了写 return 语句。
调试小技巧:如果页面出错了,先看终端里的报错信息。Flask 的报错信息很详细,会告诉你哪行代码出了问题。别慌,慢慢看,大部分问题都能自己解决。
3.6 本章小结
这一章我们干了三件事:
- 写了一个最简单的 Flask 应用,让它跑起来。
- 拆解了每一行代码,理解了路由和视图函数的概念。
- 加了多个路由,学会了动态参数的用法。
你想想看,从零到能跑一个 Web 服务器,只用了不到十行代码。Flask 就是这么轻量、这么直接。下一章,我们会深入模板引擎,让页面变得更好看、更动态。
但那是后话了。现在,你先把这个最简单的应用跑起来,感受一下「自己写的网站」带来的成就感。相信我,这种感觉会上瘾的。