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 这个参数,我建议你开发时一定要加上。它有两个好处:

  1. 代码改了,服务器自动重启,不用手动关掉再开。
  2. 出错了,浏览器会显示详细的错误信息,方便调试。

注意:生产环境千万不要用 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 图,帮你梳理本章的核心逻辑:

Flask 应用核心流程 用户浏览器 HTTP 请求 路由匹配 @app.route() 调用 视图函数 def hello(): 返回 HTTP 响应 'Hello, World!' 返回浏览器 用户请求 → 路由匹配 → 视图函数处理 → 返回响应 核心:路由决定谁来处理,视图函数决定返回什么

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 本章小结

这一章我们干了三件事:

  1. 写了一个最简单的 Flask 应用,让它跑起来。
  2. 拆解了每一行代码,理解了路由和视图函数的概念。
  3. 加了多个路由,学会了动态参数的用法。

你想想看,从零到能跑一个 Web 服务器,只用了不到十行代码。Flask 就是这么轻量、这么直接。下一章,我们会深入模板引擎,让页面变得更好看、更动态。

但那是后话了。现在,你先把这个最简单的应用跑起来,感受一下「自己写的网站」带来的成就感。相信我,这种感觉会上瘾的。

可可精品资料库