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 FastAPIFlask是给你积木你自己搭——灵活但需要做很多决策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 appFlask(__name__)app.route(/)defhello():returnh1Hello, Flask!/h1if__name____main__:app.run(debugTrue,port5000)运行python app.py打开浏览器访问http://127.0.0.1:5000/你将看到Hello, Flask!。debugTrue开启了调试模式代码修改后自动重载出错时会显示详细的调用栈。二、路由系统详解路由决定了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(keywordNone):ifkeyword:returnf搜索:{keyword}return请输入搜索关键词动态路由支持以下类型转换器string默认接受不含斜杠的文本int正整数float正浮点数path类似string但接受斜杠uuidUUID字符串路由的HTTP方法控制app.route(/login,methods[GET,POST])deflogin():ifrequest.methodPOST:# 处理登录表单usernamerequest.form.get(username)returnf欢迎回来,{username}!# GET请求显示登录页return form methodpost input nameusername placeholder用户名 input typesubmit value登录 /form 三、请求与响应对象Flask通过全局的request对象提供对所有请求数据的访问fromflaskimportFlask,request,jsonify,make_responseapp.route(/api/demo,methods[GET,POST])defapi_demo():# 获取查询参数pagerequest.args.get(page,1,typeint)# 获取JSON请求体datarequest.get_json(silentTrue)or{}# 获取表单数据namerequest.form.get(name)# 获取请求头user_agentrequest.headers.get(User-Agent)# 获取Cookiesession_idrequest.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表单数据POSTrequest.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!DOCTYPEhtmlhtmlheadtitle{{ title }} - Flask教程/title/headbodyh1{{ title }}/h1{% if user %}p欢迎, {{ user }}!/p{% else %}p请先ahref/login登录/a/p{% endif %}h2文章列表/h2ul{% for post in posts %}liahref/post/{{ post.id }}{{ post.title }}/aspan{{ post.date }}/span/li{% else %}li暂无文章/li{% endfor %}/ul/body/html渲染模板fromflaskimportrender_templateapp.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张三,postsposts)模板继承DRY原则创建公共布局templates/base.html!DOCTYPEhtmlhtmlheadtitle{% block title %}我的网站{% endblock %}/titlelinkrelstylesheethref/static/style.css/headbodynavahref/首页/aahref/about关于/a/navmain{% block content %}{% endblock %}/mainfooterpcopy;2025 Flask教程/p/footer/body/html子模板templates/about.html{% extends base.html %} {% block title %}关于我们 - Flask教程{% endblock %} {% block content %}h1关于我们/h1p这是一个使用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 relstylesheet href{{ url_for(static, filenamestyle.css) }}使用url_for()而非硬编码路径是Flask的最佳实践——当URL前缀变化时只需改一处。六、Session与Cookiefromflaskimportsession,make_response# 需要设置secret_keyapp.secret_keyyour-secret-key-here-change-in-productionapp.route(/set_session)defset_session():session[user_id]1session[username]张三returnSession已设置app.route(/get_session)defget_session():usernamesession.get(username,未登录)returnf当前用户:{username}app.route(/set_cookie)defset_cookie():respmake_response(Cookie已设置)resp.set_cookie(theme,dark,max_age60*60*24*30)returnrespSession数据存储在服务器端通过加密的Cookie传递session_idCookie直接存储在浏览器中注意不要存敏感数据。七、应用结构组织当应用变大后建议使用包模式组织代码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之所以流行正是因为它的极简设计让你能控制一切同时又通过丰富的扩展生态让你不必从零开始。