开头导语
Flask 是 Python Web 框架的"Hello World"。它小到几行代码就能跑起来,大到能支撑一个中型互联网应用。很多人学 Flask 的方式是找一个小项目跑起来,然后往里面堆代码——这种学法容易,但基础不扎实。本章从 Flask 的核心概念讲起:路由、视图函数、请求、响应、Blueprint,把每个知识点讲透,再动手写一个完整的 RESTful API。读完本章后,你能理解 Flask 的工作原理,而不是只会复制粘贴代码。
章节摘要
Flask 是 Python 轻量级 Web 框架,核心由 Werkzeug(WSGI 工具箱)和 Jinja2(模板引擎)组成。最小应用只需要几行代码:实例化 Flask、定义路由、编写视图函数。@app.route装饰器把 URL 绑定到函数,函数返回值就是响应内容。请求对象request封装了客户端请求的所有信息。Blueprint 把大型应用拆分成多个模块。app.run() 是开发服务器,生产环境用 gunicorn。
关键词
Flask、路由、视图函数、request、response、Blueprint、app.run、gunicorn、Jinja2
学习目标
- 理解 Flask 的请求-响应模型
- 掌握路由定义和视图函数编写
- 掌握 request 和 response 的用法
- 能够用 Blueprint 组织大型应用
- 理解开发服务器和生产服务器的区别
先修知识
- HTTP 协议基础知识(第51章)
- Python 基础语法、装饰器
环境准备
pipinstallflask gunicornFlask 的请求-响应模型
Flask 的工作流程极其简单:客户端发来请求 → Flask 调用对应视图函数 → 视图函数返回响应 → Flask 发回响应。
这个模型的关键是路由:把 URL 映射到视图函数。比如用户访问http://example.com/user/1,Flask 找到@app.route('/user/<int:user_id>')对应的视图函数,把user_id=1传进去,视图函数处理后返回响应。
最小 Flask 应用
fromflaskimportFlask app=Flask(__name__)@app.route("/")defindex():return"<h1>Hello Flask</h1>"@app.route("/about")defabout():return"<p>关于页面</p>"if__name__=="__main__":app.run(debug=True,host="0.0.0.0",port=8000)运行后在浏览器访问http://localhost:8000/和http://localhost:8000/about就能看到页面。
路由详解
路由参数
URL 中用<type:name>定义路径参数,Flask 会自动做类型转换:
@app.route("/user/<int:user_id>")defget_user(user_id):"""获取用户信息,user_id 是整数"""return{"user_id":user_id,"name":"Ada"}@app.route("/post/<slug>")defget_post(slug):"""获取文章,slug 是字符串"""return{"slug":slug}@app.route("/date/<int:year>/<int:month>")defget_archive(year,month):"""按年月归档"""return{"year":year,"month":month}支持的类型转换器:
| 转换器 | 类型 | 示例匹配 |
|---|---|---|
string(默认) | 字符串(不含/) | /user/ada |
int | 整数 | /user/123 |
float | 浮点数 | /rate/3.14 |
path | 路径(含/) | /files/a/b/c |
uuid | UUID | /item/550e8400-... |
HTTP 方法
路由默认只接受 GET 请求。用methods参数指定允许的方法:
@app.route("/items",methods=["GET"])deflist_items():"""列表(查)"""return{"items":["A","B","C"]}@app.route("/items",methods=["POST"])defcreate_item():"""创建(增)"""data=request.get_json()return{"created":data},201@app.route("/items/<int:item_id>",methods=["PUT"])defupdate_item(item_id):"""更新(改)"""data=request.get_json()return{"updated":item_id,"data":data}@app.route("/items/<int:item_id>"