Flask 入门教程(flask详细教程)
myzbx 2025-04-09 18:29 7 浏览
目录
- 什么是Flask?
- 环境配置与安装
- 第一个Flask应用:Hello World
- 路由与视图函数
- 模板与Jinja2
- 表单处理与用户输入
- 数据库集成(SQLite + SQLAlchemy)
- 错误处理与调试
- 完整示例:待办事项应用
- 下一步学习建议
1. 什么是Flask?
- Flask 是一个轻量级的Python Web框架,基于Werkzeug WSGI工具包和Jinja2模板引擎,适合快速开发小型到中型的Web应用。
核心特点:
- 简单易学:代码简洁,文档清晰。
- 灵活可扩展:通过插件支持数据库、表单验证、用户认证等功能。
- RESTful友好:天然支持构建API。
- 开发友好:内置调试模式,支持热重载。
2. 环境配置与安装
步骤详解:
- 安装Python
- 推荐使用Python 3.8+,可访问Python官网下载安装。
- 验证安装:
python --version # 输出应为3.8+
- 创建虚拟环境(必做)
- 作用:隔离项目依赖,避免版本冲突。
- 操作:
# 创建虚拟环境
python -m venv flask_env
# 激活虚拟环境
source flask_env/bin/activate # Linux/MacOS
.\flask_env\Scripts\activate # Windows(PowerShell)
- 安装Flask
pip install Flask
3. 第一个Flask应用:Hello World
完整代码示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True) # 启用调试模式
运行与验证:
- 保存文件为 app.py。
- 在终端运行:
python app.py
- 访问 http://127.0.0.1:5000/,页面显示 "Hello World!"。
关键点解释:
- Flask(__name__):创建应用实例,__name__用于确定资源路径。
- @app.route('/'):装饰器将URL路径/绑定到视图函数hello。
- debug=True:开启调试模式,修改代码后自动重启服务,并在浏览器显示错误详情。
4. 路由与视图函数
核心概念:
- 路由:URL路径与视图函数的映射。
- 视图函数:接收请求并返回响应(字符串、HTML、JSON等)。
动态路由示例:
@app.route('/user/')
def show_user(username):
return f'User: {username}'
@app.route('/post/')
def show_post(post_id):
return f'Post ID: {post_id}'
路由参数类型:
类型 | 说明 | 示例 |
string | 默认类型(不含斜杠) | /user/ |
int | 整数 | /post/ |
float | 浮点数 | /price/ |
path | 包含斜杠的字符串 | /path/ |
5. 模板与Jinja2
为什么需要模板?
- 分离逻辑与表现:将HTML与Python代码解耦。
- 动态渲染:通过变量、循环、条件生成页面。
使用步骤:
- 创建模板目录
项目根目录下新建 templates 文件夹(Flask默认查找此目录)。 - 编写基础模板(templates/base.html)
{% block title %}{% endblock %}
{% block content %}{% endblock %}
- 子模板继承(templates/index.html)
{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% block content %}
{{ message }}
{% for item in items %}
- {{ item }}
{% endfor %}
{% endblock %}
- 视图函数渲染
from flask import render_template
@app.route('/')
def index():
return render_template('index.html',
message='Welcome!',
items=['Apple', 'Banana', 'Cherry'])
6. 表单处理与用户输入
安全提示:
- 启用CSRF保护:生产环境中需使用Flask-WTF扩展,此处为简化示例。
表单处理示例:
- HTML表单(templates/form.html)
- 视图函数处理
from flask import request, redirect
@app.route('/form')
def show_form():
return render_template('form.html')
@app.route('/submit', methods=['POST'])
def submit():
username = request.form.get('username')
email = request.form.get('email')
# 此处应添加数据验证逻辑
return redirect(f'/user/{username}')
7. 数据库集成(SQLite + SQLAlchemy)
使用Flask-SQLAlchemy简化操作:
- 安装扩展
pip install flask-sqlalchemy
- 配置数据库(app.py)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
- 定义数据模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
- 初始化数据库
# 在Python交互环境中执行
from app import db
db.create_all()
- CRUD操作示例
# 创建用户
new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()
# 查询用户
user = User.query.filter_by(username='john').first()
# 删除用户
db.session.delete(user)
db.session.commit()
8. 错误处理与调试
自定义错误页面:
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
调试模式的高级用法:
- 开启调试器:浏览器中直接调试代码(仅限开发环境)。
- 日志记录:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
9. 完整示例:待办事项应用(优化版)
代码结构:
todo-app/
├── app.py
├── templates/
│ ├── base.html
│ ├── index.html
│ └── 404.html
└── site.db
关键代码:
app.py
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.String(200), nullable=False)
completed = db.Column(db.Boolean, default=False)
@app.route('/')
def index():
todos = Todo.query.all()
return render_template('index.html', todos=todos)
@app.route('/add', methods=['POST'])
def add():
content = request.form.get('content')
if content:
new_todo = Todo(content=content)
db.session.add(new_todo)
db.session.commit()
return redirect(url_for('index'))
@app.route('/delete/')
def delete(id):
todo = Todo.query.get_or_404(id)
db.session.delete(todo)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
with app.app_context():
db.create_all() # 自动创建数据库表
app.run(debug=True)
templates/index.html
{% extends "base.html" %}
{% block title %}Todo List{% endblock %}
{% block content %}
Todo List
{% for todo in todos %}
-
{% if todo.completed %}
{% endif %}
{{ todo.content }}
{% if todo.completed %}{% endif %}
Delete
{% endfor %}
{% endblock %}
10. 下一步学习建议
- 扩展功能:
- 用户认证:使用Flask-Login管理用户会话。
- 表单验证:通过Flask-WTF添加CSRF保护和表单验证。
- 前端增强:集成Bootstrap或JavaScript框架(如Vue.js)。
- 部署实践:
- 使用Gunicorn + Nginx部署到Linux服务器。
- 尝试云平台部署(如Heroku、AWS EC2)。
- 深入学习:
- 阅读Flask官方文档
- 学习REST API开发(Flask-RESTful扩展)
- 探索大型项目结构(蓝图、工厂模式)
通过本教程,你已掌握Flask的核心功能,包括路由、模板、数据库操作和错误处理。接下来,尝试为你的应用添加更多功能,并探索Flask生态系统的强大扩展能力!
相关推荐
- 一键生成高颜值图表!让你的文字瞬间有画面感,职场人必备!
-
哈喽,打工人们!忙碌的周中,大熊又来给你们带来一个超实用的效率神器啦!这次的宝藏网站绝对是那种用过就离不开的"真香"型产品!假设你明天就要做重要汇报,可面对一大堆密密麻麻的文字材料,你...
- 批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式
-
Word文档是我们工作中经常会打交道的一种文档格式,我们也经常会有需要对Word文档进行格式转换的需求,比如将Word格式转换为PDF、将Word文档转换为Excel、将Word...
- 绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)
-
大家好,我是一名酷爱研究AI的产品经理,最近我有个新发现:那些花了你3天做出来的PPT,现在用AI可以1小时搞定!而且颜值还高!为什么AI做PPT比传统方式效率高10倍?我用一张图就能告诉你:AI生成...
- ztext - 简单几行代码创建酷炫3D特效文字的开源JS库
-
把网页上的文字变成酷炫的3D风格,还能制作旋转动效,有了ztext.js,只需要几行代码。ztext能做什么ztext.js是一个能把常规的平面文字变成3D样式的前端开源代码库,让开发者...
- 文字内插入小图片,也太可爱了吧(文字中怎么插图片)
-
图文排版H5手机版秀米有小伙伴留言问添加图片的时候可不可以把图片添加到文字之间比如下面这句话中的小贴纸图片后面可以接着输入文字其实吧这就是咱们的『文字内插入小图片』功能嘛可以用来在文字内加个表情包又...
- Linux环境下C++代码性能分析方法(linux怎么写c++代码)
-
技术背景在开发C++应用程序时,找出代码中运行缓慢的部分是进行性能优化的关键。在Linux系统上,有多种工具和方法可用于对C++代码进行性能分析,每种方法都有其特点和适用场景。实现步骤手动中断调试法在...
- SVG互动图文,让你的文章更有趣!教你4种简单易学的黑科技玩法!
-
如果你是一个公众号创作者,那么你一定想知道如何让你的文章更加吸引人,更加有趣,更加有创意。你可能已经尝试过各种图文排版技巧,但是你是否知道,有一种黑科技可以让你的文章变得更加酷炫,更加互动,更加爆款?...
- Videoscribe怎么实现实心中文汉字的手绘制作
-
很多朋友在制作手绘视频的时候,不知道怎么输入实心的中文汉字,之前我们已经给大家分享了怎么输入汉字的方法,但是有一点遗憾的是输出的汉字是空心的手绘展示,在视觉上并不是非常的美观。经过大家不断的探索,终于...
- 一款用于将文本转化成图表的现代化脚本语言
-
大家好,又见面了,我是GitHub精选君!今天要给大家推荐一个GitHub开源项目terrastruct/d2,该项目在GitHub有超过10.3kStar,用一句话介绍该项目就是:...
- 探秘 Web 水印技术(制作水印网站)
-
作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...
- 不忍心卸载的五款神仙工具(不忍心卸载的五款神仙工具是什么)
-
001.效率工具uTools-装机必备的生产力工具集uTools是一款非常强大的可以装下几乎所有效率工具的电脑生产力工具集,目前拥有Windows、Mac和Linux三个版本。软件界面...
- 「SVG」飞花令!这份最高检工作报告“超有料”
-
原标题:【SVG】飞花令!这份最高检工作报告“超有料”栏目主编:秦红文字编辑:沈佳灵来源:作者:最高人民检察院...
- svg|2025政府工作报告,有没有你关心的数据?
-
··<setattributeName="visibility"begin="click+0s"dur="1ms"fill="freeze"restart="never"to="hi...
- videoscribe只能输入英文,如何输入中文文本?
-
videoscribe只能输入英文,如何输入中文文本?打开VideoScribe软件,打开要添加中文字体的位置。打开Photoshop并在文件中创建一个新的透明背景图层。注意:必须是透明背景层。...
- 五个流行的SVG在线编辑器(svg编辑工具)
-
随着响应网络的发展,越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎,以便在任何设备上呈现图像,甚至一些易于使用的SVG在线编辑器,可以替代PS,本文总结了五种流行的SVG...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)