初识 Flask 框架(精简版・含全代码 + 补充知识点)
一、Flask 框架是什么Flask 是Python 轻量级 Web 微框架核心简洁灵活不强制固定项目结构适合快速开发、小型项目与入门学习。核心依赖WerkzeugWSGI、路由、请求处理、Jinja2模板引擎优势上手快、可扩展、代码量少、自由度高二、环境准备与安装1. 安装 Flaskbash运行# 基础安装 pip3 install flask # 推荐使用国内镜像加速 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip install flask补充知识点Flask 依赖Python 3.6低版本 Python 不兼容pip是 Python 官方包管理工具用于安装 / 卸载第三方库三、第一个 Flask 应用Hello World完整代码app.pypython运行vim app.py from flask import Flask # 创建应用实例__name__确定项目根路径 app Flask(__name__) # 路由装饰器绑定URL与视图函数 app.route(/) def index(): # 视图函数处理请求并返回响应 return Hello, Flask! # 启动服务器 if __name__ __main__: app.run( host0.0.0.0, # 允许局域网访问 port5000, # 端口号 debugTrue # 调试模式代码自动重启、显示错误详情 )运行与访问bash运行python3 app.py浏览器访问http://192.168.10.101:5000补充知识点__name__Python 内置变量代表当前模块名Flask 用它定位静态文件与模板debugTrue仅用于开发生产环境必须关闭避免安全风险默认端口5000可自定义为 8080、8000 等四、路由与视图函数1. 动态路由python运行vim app.py from flask import Flask app Flask(__name__) app.route(/) def home(): return 首页 # name为动态参数自动传递给视图函数 app.route(/user/name) def user(name): return f欢迎你{name} if __name__ __main__: app.run(debugTrue)运行python3 app.py浏览器访问http://192.168.10.101:5000/user/zhangsan访问示例/user/张三→ 显示 “欢迎你张三”2. 支持多种 HTTP 请求方法python运行vim app.py from flask import Flask app Flask(__name__) # 仅允许POST请求 app.route(/submit, methods[POST]) def submit(): return 提交成功 # 同时支持GET/POST app.route(/login, methods[GET, POST]) def login(): return 登录页面 if __name__ __main__: app.run(debugTrue)运行python3 app.py浏览器访问curl -XPORT 192.168.10.101:5000/submit补充知识点常用请求方法GET获取数据、POST提交数据、PUT修改、DELETE删除不指定methods时默认只支持 GET请求方法不匹配会返回405 错误五、Jinja2 模板引擎1. 基础模板渲染1项目结构plaintext项目文件夹 ├── app.py └── templates # 模板必须放在此文件夹固定名 └── hello.html2hello.htmlhtml预览!DOCTYPE html html head meta charsetUTF-8 title模板页面/title /head body h1Hello, {{ username }}!/h1 /body /html3app.pypython运行from flask import Flask, render_template app Flask(__name__) app.route(/hello/username) def hello(username): # 渲染模板并传递参数 return render_template(hello.html, usernameusername) if __name__ __main__: app.run(debugTrue)2. 模板继承复用布局1基础模板 base.htmlhtml预览!DOCTYPE html html head meta charsetUTF-8 title{% block title %}默认标题{% endblock %}/title /head body {% block content %}{% endblock %} /body /html2子模板 index.htmlhtml预览{% extends base.html %} {% block title %}首页{% endblock %} {% block content %} h2这是继承后的页面内容/h2 {% endblock %}3调用模板python运行app.route(/) def home(): return render_template(index.html)补充知识点{{ 变量 }}输出变量{% 语句 %}逻辑控制循环、判断、继承templates是固定目录名不可修改否则 Flask 找不到模板六、表单处理Flask-WTF1. 安装扩展bash运行pip install flask-wtf2. 完整表单代码form_app.pypython运行from flask import Flask, render_template from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired, Length app Flask(__name__) # CSRF安全密钥生产环境用随机字符串 app.secret_key my_flask_key_123 # 定义表单类 class UserForm(FlaskForm): name StringField( 用户名, validators[ DataRequired(message用户名不能为空), Length(min2, max20, message长度2-20位) ] ) app.route(/, methods[GET, POST]) def index(): form UserForm() # 验证表单提交 if form.validate_on_submit(): return f提交成功{form.name.data} return render_template(form.html, formform) if __name__ __main__: app.run(debugTrue)3. 表单模板form.htmlhtml预览!DOCTYPE html html body form methodPOST {{ form.csrf_token }} !-- 防CSRF攻击 -- {{ form.name.label }}{{ form.name }} br button typesubmit提交/button /form /body /html补充知识点CSRF跨站请求伪造防护必须配置secret_key常用验证器DataRequired必填、Length长度、Email邮箱、EqualTo密码一致form.validate_on_submit()同时判断 POST 请求与数据合法性七、标准项目结构plaintextmy_flask_project ├── app/ │ ├── __init__.py # 应用初始化 │ ├── routes.py # 路由与视图 │ ├── forms.py # 表单类 │ ├── templates/ # 模板 │ └── static/ # 静态文件CSS/JS/图片 └── run.py # 启动入口补充知识点static存放 CSS、JS、图片访问路径/static/文件名__init__.py让文件夹变成 Python 包用于统一创建 app 实例八、生产环境部署Gunicorn1. 安装 Gunicornbash运行pip install gunicorn2. 启动命令bash运行# 2个工作进程绑定8000端口 gunicorn -w 2 -b 0.0.0.0:8000 app:app补充知识点开发用app.run()生产必须用Gunicorn/uWSGINginxapp:app前一个 app 是文件名后一个是 Flask 实例名九、小案例简易留言板app.pypython运行from flask import Flask, render_template, request app Flask(__name__) # 临时存储留言 messages [] app.route(/, methods[GET, POST]) def index(): if request.method POST: text request.form.get(msg) if text: messages.append(text) return render_template(msg.html, messagesmessages) if __name__ __main__: app.run(debugTrue)msg.htmlhtml预览!DOCTYPE html html body h1简易留言板/h1 form methodPOST input namemsg placeholder输入留言 button发送/button /form hr {% for msg in messages %} p{{ msg }}/p {% endfor %} /body /html十、核心知识点总结Flask路由 视图 模板 扩展app.route()绑定 URL 与函数Jinja2 实现 HTML 与 Python 分离Flask-WTF 简化表单与验证开发用debugTrue生产用 Gunicorn