84_Python Flask Web框架入门

Python Flask Web框架入门:从Hello World到完整应用

文章目录

  • Python Flask Web框架入门:从Hello World到完整应用
    • 前言
    • 一、安装与最小应用
    • 二、路由系统详解
      • 路由的HTTP方法控制
    • 三、请求与响应对象
    • 四、Jinja2模板引擎
      • 基础模板语法
      • 渲染模板
      • 模板继承:DRY原则
    • 五、静态文件处理
    • 六、Session与Cookie
    • 七、应用结构组织
    • 总结
    • ✅ 亮点总结
    • 适用场景
    • 扩展方向

前言

Flask是Python生态中最流行的轻量级Web框架之一。它被称为"微框架",因为它只保留了Web开发的核心功能:路由、请求处理、模板渲染,其余的都交给开发者自由选择和扩展。这种极简风格让Flask成为学习Web开发的最佳起点——你可以清晰地理解HTTP请求从浏览器到服务器再到响应的完整链路。本文将从零搭建一个Flask应用,逐步掌握路由、模板渲染和请求响应处理,为你后续学习Django或FastAPI打下坚实的基础。

Flask vs Django vs FastAPI:Flask是"给你积木,你自己搭"——灵活但需要做很多决策;Django是"给你一套精装房"——功能齐全但修改自由度低;FastAPI是"给你高性能引擎"——异步支持、自动API文档,适合前后端分离和高并发场景。初学者从Flask入手,能最清晰地理解Web框架的本质,之后再学Django和FastAPI会事半功倍。

一、安装与最小应用

Flask的安装极其简单,但安装前有一个重要的建议:永远使用虚拟环境。全局安装虽然方便,但当你有多个项目需要不同版本的Flask时,全局安装会让你陷入依赖地狱。以下是一个完整的操作步骤:

# 推荐:先创建虚拟环境python-mvenv flask_env flask_env\Scripts\activate# Windowssourceflask_env/bin/activate# Mac/Linux# 然后在虚拟环境中安装pipinstallflask

虚拟环境提醒:每个项目应该有自己独立的虚拟环境,避免不同项目的Flask版本冲突。这是Python Web开发的基本纪律,与Django项目一样。如果你跳过这一步,未来某天一定会为"为什么这个项目在别人电脑上跑不起来"而困惑。

现在创建一个最小应用。以下代码是整个Flask世界的"Hello World",虽然只有7行,但它演示了Flask最核心的三个概念:路由注册、视图函数和服务器启动:

# app.pyfromflaskimportFlask app=Flask(__name__)@app.route('/')defhello():return'<h1>Hello, Flask!</h1>'if__name__=='__main__':app.run(debug=True,port=5000)

运行python app.py,打开浏览器访问http://127.0.0.1:5000/,你将看到"Hello, Flask!"。debug=True开启了调试模式,代码修改后自动重载,出错时会显示详细的调用栈。

二、路由系统详解

路由决定了URL和视图函数的映射关系——这是Web框架最核心的功能。在Flask中,一个URL到视图的映射通过@app.route()装饰器完成。理解路由系统不仅是会用,更要理解它背后的HTTP设计——每个URL代表一个资源,不同的HTTP方法代表对该资源的不同操作。

Flask的路由装饰器功能强大,支持静态路径、动态路径和路径参数类型转换:

@app.route('/')# 根路径defindex():return'这是首页'@app.route('/user/<username>')# 动态路由defuser_profile(username):returnf'用户:{username}的个人主页'@app.route('/post/<int:post_id>')# 带类型转换的动态路由defshow_post(post_id):returnf'文章ID:{post_id}'@app.route('/search')# 路由允许多种HTTP方法@app.route('/search/<keyword>')defsearch(keyword=None):ifkeyword:returnf'搜索:{keyword}'return'请输入搜索关键词'

动态路由支持以下类型转换器:

  • string(默认):接受不含斜杠的文本
  • int:正整数
  • float:正浮点数
  • path:类似string,但接受斜杠
  • uuid:UUID字符串

路由的HTTP方法控制

@app.route('/login',methods=['GET','POST'])deflogin():ifrequest.method=='POST':# 处理登录表单username=request.form.get('username')returnf'欢迎回来,{username}!'# GET请求显示登录页return''' <form method="post"> <input name="username" placeholder="用户名"> <input type="submit" value="登录"> </form> '''

三、请求与响应对象

Flask通过全局的request对象提供对所有请求数据的访问:

fromflaskimportFlask,request,jsonify,make_response@app.route('/api/demo',methods=['GET','POST'])defapi_demo():# 获取查询参数page=request.args.get('page',1,type=int)# 获取JSON请求体data=request.get_json(silent=True)or{}# 获取表单数据name=request.form.get('name')# 获取请求头user_agent=request.headers.get('User-Agent')# 获取Cookiesession_id=request.cookies.get('session_id')return{'method':request.method,'page':page,'received':data,'user_agent':user_agent[:50]}

常用的request属性一览:

属性说明
request.methodHTTP方法
request.argsURL查询参数(GET参数)
request.form表单数据(POST)
request.json/request.get_json()JSON请求体
request.headers请求头字典
request.cookiesCookie字典
request.files上传的文件

四、Jinja2模板引擎

Flask内置了Jinja2模板引擎,它让你可以在HTML中嵌入Python逻辑——但和PHP直接将代码揉进HTML不同,Jinja2严格区分了"逻辑"和"展示"。{% %}用于控制流(if/for),{{ }}用于变量输出,{# #}用于注释。这种分离让前端开发者在不需要理解Python业务逻辑的情况下也能修改HTML布局。

基础模板语法

创建templates/index.html

<!DOCTYPEhtml><html><head><title>{{ title }} - Flask教程</title></head><body><h1>{{ title }}</h1>{% if user %}<p>欢迎, {{ user }}!</p>{% else %}<p>请先<ahref="/login">登录</a></p>{% endif %}<h2>文章列表</h2><ul>{% for post in posts %}<li><ahref="/post/{{ post.id }}">{{ post.title }}</a><span>{{ post.date }}</span></li>{% else %}<li>暂无文章</li>{% endfor %}</ul></body></html>

渲染模板

fromflaskimportrender_template@app.route('/')defindex():posts=[{'id':1,'title':'Flask入门指南','date':'2025-01-15'},{'id':2,'title':'Python机器学习实践','date':'2025-02-20'},]returnrender_template('index.html',title='首页',user='张三',posts=posts)

模板继承:DRY原则

创建公共布局templates/base.html

<!DOCTYPEhtml><html><head><title>{% block title %}我的网站{% endblock %}</title><linkrel="stylesheet"href="/static/style.css"></head><body><nav><ahref="/">首页</a><ahref="/about">关于</a></nav><main>{% block content %}{% endblock %}</main><footer><p>&copy;2025 Flask教程</p></footer></body></html>

子模板templates/about.html

{% extends "base.html" %} {% block title %}关于我们 - Flask教程{% endblock %} {% block content %}<h1>关于我们</h1><p>这是一个使用Flask构建的教程网站。</p>{% endblock %}

模板继承通过{% block %}{% extends %}让公共布局只写一次,各页只需填充差异部分。

五、静态文件处理

Flask默认将static/目录作为静态文件根目录,通过/static/URL访问:

# 放在 static/style.cssbody{font-family:'Microsoft YaHei',sans-serif;max-width:800px;margin:0auto;padding:20px;}nav a{margin-right:15px;text-decoration:none;color:#0366d6;}

在模板中引用:<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">

使用url_for()而非硬编码路径,是Flask的最佳实践——当URL前缀变化时,只需改一处。

六、Session与Cookie

fromflaskimportsession,make_response# 需要设置secret_keyapp.secret_key='your-secret-key-here-change-in-production'@app.route('/set_session')defset_session():session['user_id']=1session['username']='张三'return'Session已设置'@app.route('/get_session')defget_session():username=session.get('username','未登录')returnf'当前用户:{username}'@app.route('/set_cookie')defset_cookie():resp=make_response('Cookie已设置')resp.set_cookie('theme','dark',max_age=60*60*24*30)returnresp

Session数据存储在服务器端,通过加密的Cookie传递session_id;Cookie直接存储在浏览器中,注意不要存敏感数据。

七、应用结构组织

当应用变大后,建议使用包模式组织代码:

myapp/ ├── app.py # 应用入口 ├── config.py # 配置文件 ├── models.py # 数据模型 ├── views/ # 视图/蓝图 │ ├── __init__.py │ ├── main.py │ └── auth.py ├── templates/ # 模板 │ └── ... ├── static/ # 静态文件 │ └── ... └── requirements.txt # 依赖清单

总结

本文覆盖了Flask Web开发的核心基础知识:路由系统负责URL到视图的映射,动态路由让URL参数化,request对象提供完整的HTTP请求访问,Jinja2模板实现数据与视图的分离,静态文件session则是Web应用的标配。Flask的"微"并非功能孱弱,而是"内核精简、扩展无限"。下一篇我们将深入Flask RESTful API开发,学习如何构建前后端分离的现代Web应用。

✅ 亮点总结

  • Flask的路由系统通过装饰器@app.route()将URL与视图函数优雅绑定,直觉化且易维护
  • 动态路由(<variable>)让URL参数化,配合类型转换器实现REST风格路径
  • request对象一站式提供表单数据、查询参数、JSON body和文件上传的访问能力
  • Jinja2模板引擎支持变量插值、条件判断和循环控制,实现数据与视图的清晰分离
  • session机制基于签名的客户端Cookie,无需数据库即可维护用户状态

适用场景

  • 内部管理后台:快速搭建公司内部的工具页面、数据看板和审批系统
  • Web原型开发:在产品早期快速验证想法,Flask的简洁性让迭代速度快如闪电
  • 小型Web服务:为个人项目、小型团队搭建博客、CMS等内容管理系统

扩展方向

  • Flask扩展生态:学习Flask-SQLAlchemy(数据库ORM)、Flask-Login(认证)、Flask-Mail(邮件)等常用扩展
  • 前后端分离架构:将Flask纯作为API后端,搭配Vue/React前端构建现代SPA应用
  • 推荐阅读下一篇《Flask开发RESTful API》,学习规范化的API接口设计和最佳实践

Flask之所以流行,正是因为它的极简设计让你能控制一切,同时又通过丰富的扩展生态让你不必从零开始。